home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 49
/
Aminet 49 (2002)(GTI - Schatztruhe)[!][Jun 2002].iso
/
Aminet
/
mus
/
edit
/
AmySequencer.lha
/
AmySequencer
/
AmySequencer2.text
< prev
next >
Wrap
Text File
|
2002-04-08
|
169KB
|
4,601 lines
;-> AmySequencer2 by Stefano Maria Regattin
;d> 19 gennaio 2002 da AmySequencer
;m> 20,21,22,23,24,26,30,31 gennaio 2002
;m> 1,2,3,4,5,6,7,9,10,11,13,15,16,17,18,19,20,22,23,24,27,28 febbraio 2002
;m> 1,2,3,4,5,6,7,8,10,11,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,31 marzo 2002
;m> 1,2,4,5,6,8 Aprile 2002
;---------------------------
;------------------------------------------
;dati per i colori originali dello schermo
;original screen colours data
;-----------------------------
Data.b 0,0,0
Data.b 4,4,4
Data.b 8,8,8
Data.b 12,12,12
Data.b 12,0,0
Data.b 12,6,0
Data.b 12,12,0
Data.b 6,12,0
Data.b 0,12,0
Data.b 0,12,6
Data.b 0,12,12
Data.b 0,6,12
Data.b 0,0,12
Data.b 6,0,12
Data.b 12,0,12
Data.b 12,0,6
;------------------------------------------------------------------------
;il seguemte comando indica dove si trovano sul vostro computer i codici
; sorgenti di Blitz2 da includere in questo programma
;the following command states the place on your computer where are the Blitz2
; source codes to be included into this program
;-----------------------------------------------
INCDIR "Blitz2:Sorgenti/"
;-------------------------------------------------------------------------
;questo comando inserisce una sola volta in questo punto del programma il
; codice sorgente specificato
;-----------------------------
XINCLUDE "MIDIConstants.bb2"
;------------------------------------------------------------------------------
;le seguenti costanti servono per ricavare il periodo di un canale audio AMIGA
; dalla frequenza di campionamento; ce ne e' una per gli AMIGA PAL e una per
; quelli NTSC
;the following constants are used to obtain an AMIGA audio channel period from the
; sampling frequency; there is one for PAL AMIGAs and one for NTSC AMIGAs
;-------------------------------------------------------------------------
;PAL timing
#TemporizzazionePAL=3546895
;NTSC timing
#TemporizzazioneNTSC=3579545
;-------------------------------------------------------------------------
;questa costante indica il numero di riferimento della fonte di caratteri
; Topaz8
;this constant states the characters font Topaz8 referring number
;-----------------------------------------------------------------
#FonteDiCaratteriTopaz8=0
;-------------------------------------------------------------------------
;questa variabile imposta il periodo minimo per i canali audio; il limite
; per i vecchi AMIGA e' 123, ma io ho scelto un periodo minimo di 125, che
; corrisponde ad un La nella nona ottava
;this variable sets the audio channels minimum period for the audio channels;
; on the oldest AMIGA the lowerst usable period is 123, but I have choosen a
; minimum period of 125, that is the A note in the ninth octave
;---------------------------------------------------------------
#PeriodoMinimo=125
;---------------------------------------------------------------------------
;questa costante indica il numero di riferimento della tavolozza dei colori
; disponibili
;this constant states the colour palette referring number
;---------------------------------------------------------
#TavolozzaDeiColori=0
;--------------------------------------------------
;le seguenti costanti indicano il tipo di finestra
;the following constants state the window's kind
;------------------------------------------------
;window sizing gadget
#GadgetRidimensionaFinestra=1
;draggable window
#FinestraMovibile=2
;window depth gadget
#GadgetNascondiFinestra=4
;close gadget
#GadgetChiudiFinestra=8
;sizing window right border (you must set gimme-zero-zero to use it)
#BordoDestraFinestraRidimensionabile=16
;sizing window bottom border (you must set gimme-zero-zero to use it)
#BordoBassoFinestraRidimensionabile=32
;backdrop window
#FinestraDiSfondo=256
;gimme-zero-zero window
#FinestraConMemoriaSfondo=1024
;borderless window
#FinestraSenzaBordi=2048
;window active
#FinestraAttivata=4096
;------------------------------------------------
;le seguenti costanti indicano il tipo di gadget
;the following constants state the gadgets' kind
;------------------------------------------------
;invert
#InvertiGadget=1
;related to window's right side
#PosizioneRelativaAllaDestraDellaFinestra=2
;related to window'w bottom side
#PosizioneRelativaAlBassoDellaFinestra=4
;size as window's inner width
#ComeLarghezzaInternaFinestra=8
;size as window's inner height
#ComeAltezzaInternaFinestra=16
;box select
#ScatolaDaSelezionare=32
;horiziontal movement
#MovimentoOrizzontale=64
;vertical movement
#MovimentoVerticale=128
;no border
#NessunBordo=256
;exclude each other
#SiEscludonoLUnLAltro=512
;attach to window's right side
#AttaccaADestraDellaFinestra=1024
;attach to window's left side
#AttaccaASinistraDellaFinestra=2048
;attach to window's top
#AttaccaAllaFinestraInAlto=4096
;attach to window's bottom
#AttaccaAllaFinestraInBasso=8192
;gimme-zero-zero border gadget
#GadgetConMemoriaBordo=16384
;--------------------------------------------------------
;le seguenti costanti indicano gli eventi delle finestre
;tht following constants state window events
;--------------------------------------------
;you have pressed a mouse button
#HaiPremutoUnTastoDelTopo=8
;you have moved the mouse
#HaiMossoIlTopo=16
;you have pressed a gadget
#HaiPremutoUnGadget=32
;you have released a gadget
#HaiRilasciatoUnGadget=64
;you have activated a menu
#HaiAttivatoIlMenu=256
;you have closed the window
#HaiChiusoLaFinestra=512
;you have pressed a key
#HaiPremutoUnTasto=1024
;--------------------------------------------------------
;le seguenti costanti indicano i tasti cliccati del topo
;the following constants state the clicked mouse buttons
;--------------------------------------------------------
;left mouse button pressed
#TastoSinistroDelTopoPremuto=1
;right mouse button pressed
#TastoDestroDelTopoPremuto=2
;left mouse button released
#TastoSinistroDelTopoRilasciato=5
;right mouse button released
#TastoDestroDelTopoRilasciato=6
;-----------------------------------------------------------------------------
;le seguenti costanti indicano il valore ascii del tasti Backspace, Esc e dei
; tasti freccia
;the following constants state the ascii value for the Backspace, Esc and
; arrow keys
;------------
#Backspace=8
#Escape=27
#CursorUp=28
#CursorDown=29
#CursorRight=30
#CursorLeft=31
;Backspace key
TastoBackspace$=Chr$(#Backspace)
;Esc key
TastoEsc$=Chr$(#Escape)
;Cursor up key
TastoCursoreSu$=Chr$(#CursorUp)
;Cursor down key
TastoCursoreGiu$=Chr$(#CursorDown)
;Cursor right key
TastoCursoreDestra$=Chr$(#CursorRight)
;Cursor left key
TastoCursoreSinistra$=Chr$(#CursorLeft)
;-----------------------------------------------------------
;le seguenti costanti indicano i bottoni del joypad premuti
;the following constants state the joypad pressed buttons
;---------------------------------------------------------
#_PlayB=1
#_ReverseB=2
#_ForwardB=4
#_GreenB=8
#_YellowB=16
#_RedB=32
#_BlueB=64
;-------------------------------------------------------------------------
;le seguenti costanti indicano la direzione scelta con il joystick/joypad
;the following constants state the choosen direction by joystick/joypad
;-----------------------------------------------------------------------
#JoyMovedUp=0
#JoyMovedRight=2
#JoyMovedDown=4
#JoyMovedLeft=6
#JoyNotMoved=8
;screen
#Schermo=0
;main window
#FinestraPrincipale=0
;main window's gadget list
#ListaGadgetPrincipale=0
;main window's menu list
#ListaMenuPrincipale=0
;sounds editor window
#FinestraEditoreSuoni=1
;sounds editor window's gadget list
#ListaGadgetEditoreSuoni=1
;sound editor window's menu list
#ListaMenuEditoreSuoni=1
;notes editor window
#FinestraEditoreSequenza=2
;notes editor window's gadget list
#ListaGadgetEditoreSequenza=2
;notes editor window's menu list
#ListaMenuEditoreSequenza=2
;note editor window's zonetable
#TabellaZoneEditoreSequenza=0
;window to change basic note length
#FinestraCambioEventoBase=3
;basic note length change window's gadget list
#ListaGadgetCambioEventoBase=3
;basic note change window's zonetable
#TabellaZoneCambioEventoBase=1
;background pic's bitmap
#BitmapImmagineDiSfondo=0
;------------------------------------------------------------------------------
;queste costanti indicano i cambiamenti che possono essere applicati alle note
;these constants states different changes that can be applied to notes
;----------------------------------------------------------------------
;select an event
#SelezionaUnEvento=0
;change the channel of the selected events
#CambiaIlCanaleDegliEventiSelezionati=1
;increase by one the selected events
#AlzaDiUnoGliEventiSelezionati=2
;decrease one the selected events
#AbbassaDiUnoGliEventiSelezionati=3
;move forward the selected events
#SpostaAvantiNelTempoGliEventiSelezionati=4
;move backward the selected events
#SpostaIndietroNelTempoGliEventiSelezionati=5
;delete the selected events
#EliminaGliEventiSelezionati=6
;select all the events
#SelezionaTuttiGliEventi=7
;deselect all the events
#DeselezionaTuttiGliEventi=8
;toggle selection of all events
#InvertiLaSelezioneDiTuttiGliEventi=9
;select same kind's events with the same height and of the same channel
#SelezionaGliEventiUguali=10
;add 10 to the to the event value of the selected events that aren't notes
#AggiungiDieciAgliEventiSelezionati=11
;sub 10 to the event value of the selected events that aren't notes
#SottraiDieciAgliEventiSelezionati=12
;put up of one octave the selected notes
#AlzaDiUnOttavaLeNoteSelezionate=13
;put down of one octave the selected notes
#AbbassaDiUnOttavaLeNoteSelezionate=14
;change the value of the selected events, that is velocity for notes
#CambiaIlValoreDegliEventiSelezionati=15
;increase the selected notes length
#AllungaLaDurataDelleNoteSelezionate=16
;decrease the selected notes length
#RiduciLaDurataDelleNoteSelezionate=17
;add a beat to selected time signature events
#AggiungiUnBattitoAlTempoSelezionato=18
;sub a beat to selected time signature events
#TogliUnBattitoAlTempoSelezionato=19
;add a measure to selected time signature events
#AggiungiUnaMisuraAlTempoSelezionato=20
;sub a measure to selected time signature events
#TogliUnaMisuraAlTempoSelezionato=21
;------------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle sequenze visualizzate
;the following constants state the displayed sequences drawing mode
;-------------------------------------------------------------------
;unselected sequence
#SequenzaNonSelezionata=0
;selected sequence
#SequenzaSelezionata=1
;highlighted sequence
#SequenzaEvidenziata=2
;-------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle note visualizzate
;the following constants state the displayed notes drawing mode
;---------------------------------------------------------------
;unselected event
#EventoNonSelezionato=0
;selected event
#EventoSelezionato=1
;highlighted event
#EventoEvidenziato=2
;----------------------------------------------
;queste costanti indicano come suonare le note
;these constants state how to play notes
;----------------------------------------
;execute events from the main window
#EseguiGliEventiDallaFinestraPrincipale=0
;execute events from the sequence editor
#EseguiGliEventiDallEditoreSequenza=1
;---------------------------------------------------------------------------
;le seguenti costanti sono usate dal comando WJam per la selezione del modo
; grafico
;the following constants are used by WJam command for the graphic mode selection
;--------------------------------------------------------------------------------
;one colour with transparent background
#UnColoreConSfondoTrasparente=0
;two colours with full background
#DueColoriConSfondoPieno=1
;second time same colour
#SecondaVoltaStessoColore=2
;--------------------------------------------------------------
;le seguenti costanti indicano il tempo base che e' 4/4, cioe'
; #BattitiDiBase/#MisureDiBase
;the following constants states the basic time that is 4/4, that is
; #BattitiDiBase/#MisureDiBase
;------------------------------
;basic beats
#BattitiDiBase=4
;basic measures
#MisureDiBase=4
;sequences maximum
#MassimoSequenze=1024
; font height, notes invisible area, selected channel, note Incremento y,musical event moved by mouse
DEFTYPE .b AltezzaFonte,AreaInvisibileDelleNote,CanaleSelezionato,IncrementoYNota, EventoMusicaleSpostatoConIlTopo
; mouse pressed key, AMIGA voice off,visible area start y,note position y,visible sequences
DEFTYPE .b TastoPremutoDelTopo, VoceSpenta, YInizioAreaVisibile, YPosizioneNota, SequenzeVisibili
; editor window inner height, editor window inner width
DEFTYPE .w AltezzaInternaFinestraEditoreSequenza,LarghezzaInternaFinestraEditoreSequenza
; main window inner height, main window inner width
DEFTYPE .w AltezzaInternaFinestraPrincipale,LarghezzaInternaFinestraPrincipale
; screen height, note Incremento y,values visible area, screen height, selected sequence
DEFTYPE .w AltezzaSchermo,IncrementoYNota, AreaVisibileDeiValori,LarghezzaSchermo,SequenzaSelezionata
; slider length, tempo background x,mouse x,slider height,tempo background y,mouse y
DEFTYPE .w XLunSlider, XPosSfondoTempo, XTopo, YLunSlider, YPosSfondoTempo, YTopo
; time invisible area, note Incremento x,Sequence duration,Events,Selected events, MIDI enabled
DEFTYPE .l AreaInvisibileDelTempo,IncrementoXNota, DurataSequenza, Eventi,EventiSelezionati,MIDIAttivato
; visible area start x,note position x
DEFTYPE .l XInizioAreaVisibile, XPosizioneNota
;----------------------------------------------------------
;questa variabile riporta la parte non visibile del motivo
;this variable reports the non visible motive area
;--------------------------------------------------
AreaInvisibileDelMotivo.l=0
;-----------------------------------------------------------------------------
;questa variabile indica la velocita' di esecuzione delle note, indicata come
; battute al minuto
;this variable states the notes execution velocity, stated as bars for minute
;-----------------------------------------------------------------------------
BattuteAlMinuto.w=120
;-----------------------------------------------------
;questa variabile indica i battiti correnti del tempo
;this variable states the time's current beats
;----------------------------------------------
Battiti.b=#BattitiDiBase
;----------------------------------------------------------------------------
;la seguente variabile permette la selezione delle due diverse tavolozze dei
; colori; se vera (true), i colori saranno quelli originali, se falsa (false)
; saranno quelli dell'immagine di sfondo
;the following variable permits the selection of the two different colour
; palettes; if true the colours will be as original, if false they will be
; the ones from the pic
;-----------------------
ColoriOriginali.b=False
;-----------------------------------------------------
;questa variabile indica le misure correnti del tempo
;this variable states the time's current measures
;-------------------------------------------------
Misure.b=#MisureDiBase
;----------------------------------------------------------------------------
;questa costante indica il valore per cui bisogna moltiplicare o dividere la
; frequenza della nota per ricavare rispettivamente la nota successiva o la
; nota precedente e corrisponde a 2^(1/12)
;this constant states the value witch it must moltiply or divide the note
; frequency to obtain respectiveli the following note or the previous note and
; corresponds to 2^(1/12)
;-------------------------
DistanzaSemitono.f=1.05946309
;--------------------------------------------------------------
;questa variabile, diventando Vera, vi fa uscire dal programma
;this variable, becaming True, let you quit the program
;-------------------------------------------------------
EsciDalProgramma.b=False
;------------------------------------------
;questa variabile indica la fine del brano
;this variable states music end
;-------------------------------
FineMotivo.l=0
;------------------------------------------------------------------
;questa variabile indica se e' stata aperta la finestra principale
;this flag states if the main window is opened
;----------------------------------------------
FinestraPrincipaleAperta.b=False
;------------------------------------------------------------------------------
;Questa variabile indica la larghezza di base delle note; puo' essere cambiata
; secondo i bisogni del momento
;This variable states the basic notes width; it can be changed depending of
; the needs of the moment
;-------------------------
LarghezzaEventoDiBase.w=192
;----------------------------------------------------------------------------
;questa variabile indica se deve essere mostrato il nuovo valore dell'evento
; selezionato mosso con il mouse
;this variable states if the new value of the event dragged by mouse must be
; showed or not
;---------------
MostraNuovoValore.b=False
;----------------------------------------------------------------------
;questa variabile sara' vera (True) se una nota non e' stata terminata
;this variable will be true is a note will not be terminated
;------------------------------------------------------------
NoteSuonate.l=False
;-------------------------------------------------------------------
;questa variabile indica l'ottava selezionata nell'editore sequenza
;this variable states the selected octave in the sequence editor
;----------------------------------------------------------------
OttavaSelezionata.b=#_MiddleC/12
;---------------------------------------------------------------
;questa variabile indica la scala di visualizzazione delle note
;this variable states the notes visualiziation scale
;----------------------------------------------------
ScalaNote.b=1
;--------------------------------------------------------
;questa variabile indica il numero di sequenze esistenti
;this variable states the number of existing sequences
;------------------------------------------------------
Sequenze.w=0
;-----------------------------------------------------------------------------
;questa variabile indica se la lista degli ultimi 5 progetti e' stata scritta
;this flag states if the last 5 loaded projects list has been written
;---------------------------------------------------------------------
StoriaDeiProgettiAperti.b=False
;------------------------------------------------------------------------
;La nota base, il quarto, corrisponde a 192 tick; questa costante indica
; quanti tick passano in un 50mo di secondo per un tempo di 120 battute al
; minuto
;The basic note, the quarter, correspond to 192 ticks; this constant signs how
; many tick takes place in a 50th of a second
;---------------------------------------------
TicPerCinquantesimoDiSecondo.f=30.72
;--------------------------------------------------------------------------
;la seguente variabile stringa indica il tipo di evento musicale corrente;
; all'inizio e' impostata sull'evento nota
;the following string variable states the current event; at the beginning is
; set on the note event
;-----------------------
TipoDiEvento$="Note"
;------------------------------------------------------------------------------
;questa variabile indica per le note la velocita' di base e per i controlli il
; valore di base; valore utile da zero a 127
;this variable states for the notes the basic velocity and for the controls
; the basic value; useful value from zero to 127
;------------------------------------------------
ValoreEventoDiBase.b=64
;-----------------------------------------------------------------------
;questa variabile indica la posizione della voce Quit del menu' Project
;this variable marks the position of voice Quit in the Project menu
;-------------------------------------------------------------------
VoceMenuEsci.b=4
;------------------------------------------------------------------------------
;questa variabile indica la posizione d'inizio per la visualizzazione delle
; sequenze
;this variables states the start position for the sequences displaying
;----------------------------------------------------------------------
XSequenzeVisibili.l=0
;-------------------------------------------------------------
;questa variabile memorizza la prima sequenza da visualizzare
;this variable stores the first sequence to be displayed
;--------------------------------------------------------
YSequenzeVisibili.w=0
;-----------------------------------------------------------------------
;queste 5 variabili conterranno i nomi degli ultimi 5 progetti caricati
;this 5 variables will keep names of last 5 projects loaded
;-----------------------------------------------------------
Dim ProgettoAperto$(4)
;-----------------------------------------------------------------------------
;questa struttura di variabili e' una tabella di riferimento per il periodo e
; la frequenza associati ad ognuna delle 128 note possibili
;this variables structure is a refferring table for the periode and frequency
; paired to every one of the 128 given notes
;--------------------------------------------
NEWTYPE .PeriFreq
;--------
;periode
;--------
Periodo.l
;----------
;frequency
;----------
Frequenza.f
End NEWTYPE
Dim PeriFreq.PeriFreq(127)
;--------------------------------------------------------------------------
;la seguente struttura di variabili serve per identificare il tipo di note
;the following variables structure is used to states the notes kind
;-------------------------------------------------------------------
NEWTYPE .TipoDiNota
;note italian name
NomeItaliano$
;note english name
NomeInglese$
;diesis flag
Diesis.b
;note octave
Ottava.b
End NEWTYPE
Dim TipoDiNota.TipoDiNota(127)
;----------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione dei suoni
;the following variables structure is for sounds management
;-----------------------------------------------------------
NEWTYPE .Suono
;---------------------------------------------------
;questa variabile indica il nome del suono caricato
;this variable states the name of the loaded sound
;--------------------------------------------------
Nome$
;----------------------------------------------------------------------------
;questa variabile indica il canale associato al suono caricato; valore utile
; da 1 a 16
;this variable states the channel linked to the loaded sound; useful value
; from 1 to 16
;--------------
Canale.b
End NEWTYPE
Dim Suono.Suono(31)
NEWTYPE .Sequenza
;--------------------------------------------------
;questa variabile memorizza il nome della sequenza
;this variable stores the sequence name
;---------------------------------------
Nome$
;----------------------------------------------------------
;questa variabile indica l'inizio temporale della sequenza
;this variable states the sequence time start
;---------------------------------------------
Inizio.l
;---------------------------------------------------------
;questa variabile indica la fine temporale della sequenza
;this variable states the sequence time end
;-------------------------------------------
Durata.l
;------------------------------------------------------------------
;questa variabile indica gli eventi musicali totali della sequenza
;this variable states the sequence's total musical events
;---------------------------------------------------------
Eventi.l
;-----------------------------------------------------------------------
;questa variabile indica gli eventi musicali selezionati della sequenza
;this variable states the sequence's selected musical events
;------------------------------------------------------------
EventiSelezionati.l
End NEWTYPE
Dim Sequenza.Sequenza(#MassimoSequenze-1)
;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione degli eventi musicali
;the following vars structure is for the musical events management
;------------------------------------------------------------------
NEWTYPE .EventoMusicale
;----------------------------------------------------------------------------
;questa variabile stringa indica il tipo di evento musicale, che puo' essere
; una nota od un parametro MIDI
;This string variable states the musical event kind, that can be a note or a
; MIDI parameter
;----------------
Tipo$
;-----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica l'altezza;
; valore utile da zero a 127
;if the event is a note, this variable states its height; useful value from
;zero to 127
;------------
Evento.b
;----------------------------------------------------------------------------
;questa variabile indica la posizione dell'evento musicale nel tempo in tic;
; valore utile da zero a 2 miliardi e rotti
;this variable states musical event position in time by ticks; useful value
;from zero to over 2 billions
;-----------------------------
Inizio.l
;------------------------------------------------------------------------------
;questa varibile indica il canale dell'evento musicale; valore utile da 1 a 16
;this variable states musical event's channel; useful value from 1 to 16
;------------------------------------------------------------------------
Canale.b
;-----------------------------------------------------------------------------
;questa variabile identifica la sequenza di appartenenza dell'evento musicale
; valore utile da 1 a 500
;this variable states the sequence witch the musical event belong to: useful
; value from 1 to 500
;---------------------
Sequenza.w
;------------------------------------------------------------------
;questa variabile indica se l'evento musicale e' stato selezionato
;this variable states if the musical event has been selected
;------------------------------------------------------------
Selezionato.b
;----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile indica se e' stata
; suonata: se il valore e' zero, la nota non e' stata ancora EseguiGliEventita; se il
; valore e' 1, il programma sta do la nota; se il valore e' 2, il
; programma ha smesso di suonare la nota
;if the musical event is a note, this variable states if it has been played:
; if the value is zero, the note has not been played yet; if the value is 1,
; the program is playing the note; if the value is 2, the program has finished
; to play the note
;------------------
Eseguito.b
;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica in tic la durata
; nel tempo; valore utile da 0 a 2 miliardi e rotti (192 tic=nota di un quarto)
;if the event is a note, this variable states its duration in time by ticks;
;useful value from zero to over 2 billions (192 ticks=a quarter note)
;---------------------------------------------------------------------
Durata.l
;--------------------------------------------------------------------------
;se l'evento musicale e'una nota, questa variabile ne indica l'intensita',
;cioe' il suo volume; se invece l'evento e' un controllo ne indica il valore
;if the musical event is a note, this variable states its intensity, that is
; its volume; if instead is a control it states its value
;---------------------------------------------------------
Valore.b
;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile indica quale voce AMIGA e'
; stata usata per suonarla
;if the musical event si a note, this variable states witch AMIGA voice has
; been used to play it
;----------------------
VoceUsata.b
End NEWTYPE
DEFTYPE .EventoMusicale NotaSuonata
;-----------------------------------------------------
;imposta il numero massimo di eventi musicali usabili
;sets the maximun musical events handling
;-----------------------------------------
MassimoEventiMusicali.l=Min((FastFree-65536)/SizeOf .EventoMusicale,32768)
;---------------------------------------------------------------------------
;crea le variabili array lista con la struttura del NEWTYPE .EventoMusicale
;creates the list array variables with the NEWTYPE .EventoMusicale structure
;----------------------------------------------------------------------------
Dim List EventoMusicale.EventoMusicale(MassimoEventiMusicali-1)
;-----------------------------------------------------------------
;questa variabile indica se e' stato attivato un dispoditivo MIDI
;this variable states if a MIDI device has been activated
;---------------------------------------------------------
MIDIAttivato.l=0
;--------------------------------------------------------------------------------
;questa variabile permette di mostrare i tasti da usare nell'editore sequenza la
; prima volta che vi ci si entra
;this variable permits to show the keys to use in the sequence editor the first
; time you enter it
;-------------------
PrimaVoltaNellEditoreSequenza.b=True
;--------------------------------------------------------------------------
;questa procedura imposta la fonte di caratteri Topaz8 per schermo, menu e
; requester, ma non per le finestre
;this procedure sets the characters font Topaz8 for screen, menus and
; requester, but not for windows
;--------------------------------
Statement CaricaLaFonteDiCaratteriTopaz8{}
SHARED AltezzaFonte
AltezzaFonte=8:LoadFont #FonteDiCaratteriTopaz8,"topaz.font",AltezzaFonte
End Statement
;-----------------------------------------------
;questa procedura imposta il parlato dell'AMIGA
;this procedure sets the AMIGA speech
;-------------------------------------
Statement ImpostaIlParlatoDellAmiga{}
SetVoice 130,250,0,1,64,22200
End Statement
;-----------------------------------------------
;questa procedura carica le immagini delle note
;this procedure loads the note images
;-------------------------------------
Statement CaricaLeImmaginiDelleNote{}
BitMap 0,126,16,1
LoadBitMap 0,"Notes.2Cols"
GetaShape 0,0,0,22,16
GetaShape 1,23,0,12,16
GetaShape 2,36,0,12,16
GetaShape 3,49,0,17,16
GetaShape 4,67,0,17,16
GetaShape 5,85,0,17,16
GetaShape 6,103,0,17,16
GetaShape 7,121,0,5,16
Free BitMap 0
End Statement
n;---------------------------------------------
;questa procedura attiva la trasmissione MIDI
;this procedure activates the MIDI transmission
;-----------------------------------------------
Statement AttivaMIDI{}
SHARED MIDIAttivato
Use Window #FinestraPrincipale
WJam #DueColoriConSfondoPieno
Repeat
If MIDIAttivato=True Then CloseSerial 0
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3:Print "Please type your MIDI device name>"
DispositivoMIDI$=StripLead$(StripTrail$(Edit$("serial.device",35),Asc(" ")),Asc(" "))
WLocate 0,0:Print SPACE$(80)
If DispositivoMIDI$<>""
MIDIAttivato=OpenSerial(DispositivoMIDI$,0,31250,16)
If MIDIAttivato=0
EZRequest "AmySequencer message","Unable to open MIDI|on "+DispositivoMIDI$,"OK"
Else
MIDIAttivato=True
EndIf
EndIf
Until MIDIAttivato=True
EZRequest "AmySequencer message","MIDI has been activated|on "+DispositivoMIDI$,"OK"
WJam #UnColoreConSfondoTrasparente
End Statement
;-------------------------------------------------
;questa procedura cambia la misurazione del tempo
;this procedure change the time misuration
;------------------------------------------
Statement CambiaLaMisuraDelTempo{}
SHARED Battiti
SHARED Misure
Use Window #FinestraPrincipale
WJam #DueColoriConSfondoPieno
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3:Print "Please type the basic time beat>"
Battiti=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
Battiti=Min(Max(Battiti,1),16)
WLocate 0,0:Print SPACE$(80)
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3:Print "Please type the basic time measures>"
Misure=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
Misure=Min(Max(Misure,1),8)
WJam #UnColoreConSfondoTrasparente
End Statement
;--------------------------------------------------------
;questa procedura mostra gli eventi musicali disponibili
;this procedure shows the available musical events
;--------------------------------------------------
Statement MostraGliEventiMusicaliDisponibili{}
SHARED MassimoEventiMusicali
SHARED Sequenza()
SHARED Sequenze
SHARED TotaleEventiMusicali
TotaleEventiMusicali=0
For Sequenza.w=0 To #MassimoSequenze-1
TotaleEventiMusicali+Sequenza(Sequenza)\Eventi
Next Sequenza
Use Window #FinestraPrincipale
WLocate 0,0:WColour 3:Print MassimoEventiMusicali," events allocated, ",TotaleEventiMusicali," event"
If TotaleEventiMusicali<>1 Then Print "s"
Print " used, "
If Sequenze>0
Print Str$(Sequenze)," sequence":If Sequenze>1 Then Print "s"
Else
Print "no sequences"
EndIf
End Statement
;----------------------------------------------
;questa procedura mostra il tempo delle misure
;this procedure shows the measures' tempo
;-----------------------------------------
Statement MostraIlTempo{Tempo.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
WJam #DueColoriConSfondoPieno
WLocate XMessaggio,YMessaggio
WColour 1,0
Print SPACE$(80-XMessaggio/8)
WLocate XMessaggio,YMessaggio
EndIf
If Modo=#EseguiGliEventiDallaFinestraPrincipale
WBlit 8,XPosSfondoTempo,YPosSfondoTempo
WJam #UnColoreConSfondoTrasparente
WLocate (80-Len("Tempo=00/00"))*8,AltezzaInternaFinestraPrincipale-8-8
WColour 3,0
EndIf
Format "00":Print "Tempo=",Str$(Tempo MOD 16+1),"/",Str$(Tempo/16+1):Format ""
End Statement
;----------------------------------------------------------------------------
;questa procedura crea una tabella di riconoscimento delle note, memorizzata
; nell'array TipoDiNota()
;this procedure crates a referring note recognition table, stored in the
; TipoDiNota() array (that means Note Kind)
;-------------------------------------------
Statement ImpostaIlTipoDiNota{Nota.b}
SHARED TipoDiNota()
;--------------------------------------------
;questa variabile indica l'ottava della nota
;this variable state the note octave
;------------------------------------
OttavaDellaNota.b=Nota/12
TipoDiNota(Nota)\Ottava=OttavaDellaNota
;-----------------------------------------------------------------------
;questa variabile indica a quali delle 12 note dodici note fondamentali
; corrisponde la nota corrente
;this variable marks which of 12 fundamental notes corresponds the current
; note
;------
NotaNellOttava.b=Nota MOD 12
Select NotaNellOttava
;------------------
;la nota e' un Do?
;is the given note a C?
;-----------------------
Case 0
TipoDiNota(Nota)\NomeItaliano="Do"
TipoDiNota(Nota)\NomeInglese="C"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Do diesis (Do#)?
;is the given note a C diesis (C#)?
;-----------------------------------
Case 1
TipoDiNota(Nota)\NomeItaliano="Do#"
TipoDiNota(Nota)\NomeInglese="C#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Re?
;is the given note a D?
;-----------------------
Case 2
TipoDiNota(Nota)\NomeItaliano="Re"
TipoDiNota(Nota)\NomeInglese="D"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Re diesis (Re#)?
;is the given note a D diesis (D#)?
;-----------------------------------
Case 3
TipoDiNota(Nota)\NomeItaliano="Re#"
TipoDiNota(Nota)\NomeInglese="D#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Mi?
;is the given note a E?
;-----------------------
Case 4
TipoDiNota(Nota)\NomeItaliano="Mi"
TipoDiNota(Nota)\NomeInglese="E"
TipoDiNota(Nota)\Diesis=False
;------------------
;la nota e' un Fa?
;is the given note a F?
;-----------------------
Case 5
TipoDiNota(Nota)\NomeItaliano="Fa"
TipoDiNota(Nota)\NomeInglese="F"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Fa diesis (Fa#)?
;is the given note a F diesis (F#)?
;-----------------------------------
Case 6
TipoDiNota(Nota)\NomeItaliano="Fa#"
TipoDiNota(Nota)\NomeInglese="F#"
TipoDiNota(Nota)\Diesis=True
;-------------------
;la nota e' un Sol?
;is the given note a G?
;-----------------------
Case 7
TipoDiNota(Nota)\NomeItaliano="Sol"
TipoDiNota(Nota)\NomeInglese="G"
TipoDiNota(Nota)\Diesis=False
;---------------------------------
;la nota e' un Sol diesis (Sol#)?
;is the given note a G diesis (G#)?
;-----------------------------------
Case 8
TipoDiNota(Nota)\NomeItaliano="Sol#"
TipoDiNota(Nota)\NomeInglese="G#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un La?
;is the given note an A?
;------------------------
Case 9
TipoDiNota(Nota)\NomeItaliano="La"
TipoDiNota(Nota)\NomeInglese="A"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un La diesis (La#)?
;is the given note an A diesis (A#)?
;------------------------------------
Case 10
TipoDiNota(Nota)\NomeItaliano="La#"
TipoDiNota(Nota)\NomeInglese="A#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Si?
;is the given note a B?
;-----------------------
Case 11
TipoDiNota(Nota)\NomeItaliano="Si"
TipoDiNota(Nota)\NomeInglese="B"
TipoDiNota(Nota)\Diesis=False
End Select
End Statement
Statement CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
SHARED PeriFreq()
SHARED DistanzaSemitono
;--------------------------------------------------------------------------------
;per ottenere la frequenza di tutte le 128 note, si parte dal La della 2a ottava
; (la prima e' l'ottava zero), la cui frequenza e' nota e la si moltiplica o
; divide per la distanza minima tra due note che e' il semitono; per ottenere il
; periodo si divide una delle costanti di temporizzazione, a seconda che il
; il proprio AMIGA usi uno schermo PAL o NTSC, per la frequenza della nota; queste
; costanti sono riportate sul MANUALE DI RIFERIMENTO PER L'HARDWARE AMIGA.
;to obtain all 128 notes it starts from the A from the 3rd octave (the 1st is the
; zero octave) that has a known frequency, and it multiply or divide this for the
; minimum distance between two notes that is the semitone; to obtain the period it
; divides one of the timing constants, depending on your AMIGA uses a PAL or NTSC
; screen, for the note frequency; these constants are reported the AMIGA HARDWARE
; REFERENCE MANUAL
;------------------
PeriFreq(45)\Frequenza=440
If NTSC=True
PeriFreq(45)\Periodo=#TemporizzazioneNTSC/PeriFreq(45)\Frequenza
Else
PeriFreq(45)\Periodo=#TemporizzazionePAL/PeriFreq(45)\Frequenza
EndIf
ImpostaIlTipoDiNota{45}
For Nota.w=46 To 127
PeriFreq(Nota)\Frequenza=PeriFreq(Nota-1)\Frequenza*DistanzaSemitono
If NTSC=True
PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
Else
PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
EndIf
ImpostaIlTipoDiNota{Nota}
Next Nota
For Nota=44 To 0 Step -1
PeriFreq(Nota)\Frequenza=PeriFreq(Nota+1)\Frequenza/DistanzaSemitono
If NTSC=True
PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
Else
PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
EndIf
ImpostaIlTipoDiNota{Nota}
Next Nota
End Statement
;-----------------------------------------------------------------------------
;la seguente procedura converte un valore temporale da tic in battute, quarti
; e tic; la variabile OrigineZero serve per la differente visualizzazione
; della durata delle note che parte da zero
;the following procedure converts a time value from tcksin bars, quarters and
; ticks; the OrigineZero variable is used for the different note length
; displaying that starts from zero
;----------------------------------
Statement ConvertiIlTempoInBattute{Tempo.l,Battiti.b,Misure.b,OrigineZero.b}
If OrigineZero=True
Battute.b=Tempo/(192*4.0/Misure*Battiti)
Battiti.b=(Tempo/(192/(Misure/4.0))) MOD Battiti
Else
Battute=Tempo/(192*4.0/Misure*Battiti)+1
Battiti=(Tempo/(192/(Misure/4.0))) MOD Battiti+1
EndIf
Print Battute,".",Battiti
Tic.w=Tempo MOD (192/(Misure/4.0))
If Tic>0 Then Print ".",Tic
End Statement
;-------------------------------------------------
;questa procedura imposta le barre di scorrimento
;this procedure sets sliders
;----------------------------
Statement ImpostaSlider{Slider.l,XPos.w,YPos.w,Orientamento$,Parametri.l,ListaGadgetSlider.l}
SHARED XLunSlider
SHARED YLunSlider
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL" Then Parametri+#MovimentoOrizzontale
If Orientamento$="VERTICAL" Then Parametri+#MovimentoVerticale
PropGadget ListaGadgetSlider,XPos,YPos,Parametri,Slider,XLunSlider,YLunSlider
End Statement
;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manages the sliders
;-----------------------------------
Statement MostraSlider{Slider.l,ValoreDato.l,ValoreMassimo.l,Orientamento$,ListaGadgetSlider.l,FinestraSlider.l}
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL"
SetHProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
EndIf
If Orientamento$="VERTICAL"
SetVProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
EndIf
Redraw FinestraSlider,Slider
End Statement
;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manage the sliders
;----------------------------------
Function .l ValoreSlider{Slider.l,ValoreMassimo.l,LunghezzaSlider.l,Orientamento$,ListaGadgetSlider.l}
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL"
ValoreSlider.f=HPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
ValoreIndicatoDalTopo.w=EMouseX*ValoreMassimo/LunghezzaSlider
EndIf
If Orientamento$="VERTICAL"
ValoreSlider=VPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
ValoreIndicatoDalTopo=EMouseY*ValoreMassimo/LunghezzaSlider
EndIf
ValoreIndicatoDalloSlider.l=Int(ValoreSlider)
If ValoreIndicatoDalTopo>ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider+1
If ValoreIndicatoDalTopo<ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider-1
ValoreIndicatoDalloSlider=Min(Max(ValoreIndicatoDalloSlider,0),ValoreMassimo)
Function Return ValoreIndicatoDalloSlider
End Function
;--------------------------------------------------------------
;questa procedura cancella il file storico dei progetti aperti
;this procedure clears the loaded projects history file
;-------------------------------------------------------
Statement CancellaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
KillFile "ProjectsHistory"
VoceMenuEsci=4
StoriaDeiProgettiAperti=False
For ProgettoAperto.b=0 To 4
ProgettoAperto$(ProgettoAperto)=""
Next ProgettoAperto
End Statement
;------------------------------------------------------------
;questa procedura carica il file storico dei progetti aperti
;this procedure loads the loaded projects history file
;------------------------------------------------------
Statement CaricaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
StoriaDeiProgettiAperti=ReadFile(0,"ProjectsHistory")
If StoriaDeiProgettiAperti=True
FileInput 0
ProgettoAperto=0
Repeat
Dato$=Inkey$
If Dato$=Chr$(10)
ProgettoAperto+1
VoceMenuEsci+1
Else
ProgettoAperto$(ProgettoAperto)+Dato$
EndIf
Until Dato$=""
CloseFile 0
PopInput
EndIf
End Statement
;------------------------------------------------------------------
;crea la bitmap per l'immagine di sfondo della finestra principale
;creates the bitmap for the background pic of the main window
;-------------------------------------------------------------
Statement CreaLaBitmapPerLImmagineDiSfondo{}
;----------------------------------------
;crea la bitmap per l'immagine di sfondo
;creates the bitmap for the background pic
;------------------------------------------
BitMap #BitmapImmagineDiSfondo,640,240,4
End Statement
;-------------------------------------------------------------------
;carica l'immagine di sfondo della finestra principale nella bitmap
;loads the background pic of the main window into the bitmap
;------------------------------------------------------------
Statement CaricaLImmagineDiSfondoNellaBitmap{}
SHARED ColoriOriginali
If ColoriOriginali=True
ImmagineDiSfondo$="BackPicOC.16Cols"
Else
ImmagineDiSfondo$="BackPic.16Cols"
EndIf
;----------------------------------------------------------------------------
;carica l'immagine di sfondo per la finestra principale nella bitmap creata
; per questa
;loads the main window background image into the bitmap creted for it
;---------------------------------------------------------------------
LoadBitMap #BitmapImmagineDiSfondo,ImmagineDiSfondo$,#TavolozzaDeiColori
;---------------------------------------------------
;usa la tavolozza dei colori dell'immagine caricata
;use loaded image colours palette
;---------------------------------
Use Palette #TavolozzaDeiColori
End Statement
;------------------------------------
;questa procedura imposta lo schermo
;this procedure sets the screen
;-------------------------------
Statement ImpostaLoSchermo{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED SequenzeVisibili
;--------------------------------------
;imposta la fonte di caratteri globale
;sets the global characters font
;--------------------------------
Use IntuiFont #FonteDiCaratteriTopaz8
;------------------------------------
;inizializza la tavolozza dei colori
;initializes the colours palette
;--------------------------------
InitPalette #TavolozzaDeiColori,16
;-------------------------------
;carica i colori per lo schermo
;loads colours for screen
;-------------------------
; For Colore.b=0 To 15
; Read Rosso.b
; Read Verde.b
; Read Blu.b
; PalRGB #TavolozzaDeiColori,Colore,Rosso,Verde,Blu
; Next Colore
;----------------------------------------------------------------
;imposta le penne dello schermo con i migliori colori (ROM 2.0+)
;sets screen pens with best colours (ROM 2.0+)
;----------------------------------------------
ScreenPens 3,2,0,1,3,1,2
;------------------------------------------------
;apre lo schermo in alta risoluzione a 16 colori
;opens high resolution screen with 16 colours
;---------------------------------------------
Screen #Schermo,4+8,"AmySequencer by Stefano Maria Regattin"
;-----------------------------
;usa la tavolozza dei colori
;use colours palette
;--------------------
Use Palette #TavolozzaDeiColori
;-------------------------------------------------------------------------------
;questa variabile contiene l'indirizzo di memoria della struttura dello schermo
;this variable retains the screen structure memory address
;----------------------------------------------------------
IndirizzoSchermo.l=Peek.l(Addr Screen(0))
;----------------------------------------------------------
;questa variabile contiene la vera larghezza Dello schermo
;this variable retains the true screen width
;--------------------------------------------
LarghezzaSchermo=Peek.w(IndirizzoSchermo+12)
;--------------------------------------------------------
;questa variabile contiene la vera altezza dello schermo
;this variable retains the true screen height
;---------------------------------------------
AltezzaSchermo=Peek.w(IndirizzoSchermo+14)
;---------------------------------------------------------------------
;questa variabile indica il massimo numero di sequenze visualizzabili
;this variable states the displayed sequences maximum number
;------------------------------------------------------------
SequenzeVisibili.b=(AltezzaSchermo-(AltezzaFonte+3)-8-8-8)/8
End Statement
;-----------------------------------------------------------------------
;questa procedura mostra l'immagine di sfondo nella finestra principale
;this procedure shows the background pic into the main window
;--------------------------------------------------------------
Statement MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;---------------------------------------------------------
;copia l'immamgine dalla bitmap nella finestra principale
;copies the pic from the bitmap into the main window
;----------------------------------------------------
BitMaptoWindow #BitmapImmagineDiSfondo,#FinestraPrincipale,0,0,0,0,640,240
End Statement
Statement CopiaLoSfondoSottoAlTempo{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
XPosSfondoTempo.w=LarghezzaInternaFinestraPrincipale-1-Len("Tempo=00/00")*8
YPosSfondoTempo.w=AltezzaInternaFinestraPrincipale-8-8
XLunSfondoTempo.b=Len("Tempo=00/00")*8
YLunSfondoTempo.b=8
GetaShape 8,XPosSfondoTempo,YPosSfondoTempo,XLunSfondoTempo,YLunSfondoTempo
End Statement
;-------------------------------------------------------------------------------
;Questa procedura imposta la finestra principale invisibile e reimposta il menu
; principale
;this procedure sets the main invisible window and resets the main menu
;-----------------------------------------------------------------------
Statement ImpostaLaFinestraPrincipale{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraPrincipale
SHARED AltezzaSchermo
SHARED AreaInvisibileDelMotivo
SHARED BattuteAlMinuto
SHARED FineMotivo
SHARED FinestraPrincipaleAperta
SHARED LarghezzaInternaFinestraPrincipale
SHARED LarghezzaSchermo
SHARED ProgettoAperto$()
SHARED Sequenze
SHARED SequenzeVisibili
SHARED StoriaDeiProgettiAperti
SHARED TicPerCinquantesimoDiSecondo
SHARED VoceMenuEsci
SHARED XLunSlider
SHARED XSequenzeVisibili
SHARED YLunSlider
SHARED YSequenzeVisibili
;-----------------------------------------------
;se la finestra era gia' stato aperto la chiude
;if window was opened it close it
;---------------------------------
If FinestraPrincipaleAperta=True
BeepScreen #Schermo
Free GadgetList #ListaGadgetPrincipale
Free MenuList #ListaMenuPrincipale
CloseWindow #FinestraPrincipale
EndIf
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
;-------------------------
;imposta il menu' Project
;sets Project menu
;------------------
MenuTitle #ListaMenuPrincipale,0,"Project"
MenuItem #ListaMenuPrincipale,0,0,0,"New"
MenuItem #ListaMenuPrincipale,0,0,1,"Load"
MenuItem #ListaMenuPrincipale,0,0,2,"Save"
MenuItem #ListaMenuPrincipale,0,0,3,"Save as"
If StoriaDeiProgettiAperti=True
For ProgettoAperto.b=4 To VoceMenuEsci-1
MenuItem 0,0,0,ProgettoAperto,ProgettoAperto$(ProgettoAperto-4)
Next ProgettoAperto
EndIf
MenuItem 0,0,0,VoceMenuEsci,"Quit"
;--------------------------
;imposta il menu' Controls
;sets Controls menu
;------------------
MenuTitle #ListaMenuPrincipale,1,"Controls"
MenuItem #ListaMenuPrincipale,0,1,0,"Play"
;-------------------------
;imposta il menu' Windows
;sets Windows menu
;------------------
MenuTitle #ListaMenuPrincipale,2,"Windows"
MenuItem #ListaMenuPrincipale,0,2,0,"Sounds Editor"
MenuItem #ListaMenuPrincipale,0,2,1,"Sequence Editor"
;-----------------------
;imposta il menu' Prefs
;sets Prefs menu
;----------------
MenuTitle #ListaMenuPrincipale,3,"Prefs"
MenuItem #ListaMenuPrincipale,0,3,0,"Set MIDI device"
MenuItem #ListaMenuPrincipale,1,3,1," Original colours"
MenuItem #ListaMenuPrincipale,0,3,2,"Clear projects history"
;-------------------------------------------------------------------
;apre la finestra principale per ricavarne la larghezza e l'altezza
;opens main window to obtain its width and height
;-------------------------------------------------
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#FinestraDiSfondo+#FinestraSenzaBordi+#FinestraAttivata
Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;-------------------------------------------------------------------------
;questa variabile conserva la larghezza interna della finestra principale
;this variable stores the inner witdh of the main window
;--------------------------------------------------------
LarghezzaInternaFinestraPrincipale.w=InnerWidth
;----------------------------------------------------------------------
;questa variabile conserva l'altezza interna della finestra principale
;this variable stores the inner height of the main window
;---------------------------------------------------------
AltezzaInternaFinestraPrincipale.w=InnerHeight
;------------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione del tempo
;copies into memory the time indication's on screen position background
;-----------------------------------------------------------------------
CopiaLoSfondoSottoAlTempo{}
CloseWindow #FinestraPrincipale
;----------------------------------------------------------------------
;imposta la barra di scorrimento che regola la velocita' di esecuzione
;sets the slider that tunes the execution velocity
;_-------------------------------------------------
XLunSlider=LarghezzaInternaFinestraPrincipale
YLunSlider=8
ImpostaSlider{1,0,AltezzaInternaFinestraPrincipale-8,"HORIZONTAL",0,#ListaGadgetPrincipale}
;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
XLunSlider=16
YLunSlider=SequenzeVisibili*8
ImpostaSlider{2,0,8,"VERTICAL",0,#ListaGadgetPrincipale}
;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
XLunSlider=LarghezzaInternaFinestraPrincipale-16
YLunSlider=4
ImpostaSlider{3,16,8+SequenzeVisibili*8,"HORIZONTAL",0,#ListaGadgetPrincipale}
;------------------------------------------------------------------------------
;apre la finestra principale solo per il menu' come invisibile e ci attacca la
; lista dei gadget principale
;opens main window for menu usage only as invisible and it attaches the main
; gadget list
;-------------
Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetPrincipale
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuPrincipale
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #UnColoreConSfondoTrasparente
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
MostraSlider{1,BattuteAlMinuto-10,300-9,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}
;-------------------------------------------------------------------
;mostra la velocita' di esecuzione delle note in battute per minuto
;shows the execution velocity in bar per minute
;-----------------------------------------------
WLocate 0,AltezzaInternaFinestraPrincipale-8-8:WColour 3
Print "BPM>",BattuteAlMinuto," Ticks/50th>",TicPerCinquantesimoDiSecondo
;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
MostraSlider{2,YSequenzeVisibili,#MassimoSequenze-SequenzeVisibili,"VERTICAL",#ListaGadgetPrincipale,#FinestraPrincipale}
;-------------------------------------
;calcola l'area invisibile del motivo
;evaluate the motive's invisible area
;_------------------------------------
AreaInvisibileDelMotivo=Max(FineMotivo-(LarghezzaInternaFinestraPrincipale-16),0)
;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
MostraSlider{3,XSequenzeVisibili,AreaInvisibileDelMotivo,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}
MostraIlTempo{(#MisureDiBase-1)*16+#BattitiDiBase-1,#EseguiGliEventiDallaFinestraPrincipale}
;-----------------------------------------------------------------
;le finestre di richiesta sono assegnate alla finestra principale
;the request windows are assigned to main window
;------------------------------------------------
EZOutput #FinestraPrincipale
FinestraPrincipaleAperta=True
End Statement
;--------------------------------------------------------------------------
;questa procedura per ora legge solo il nome di un file e o inserisce nel
; menu principale; dovrebbe caricare un progetto di AmySequencer
;this procedure till now only reads a file name and put it into the main menu
; it should load an AmySequencer project
;----------------------------------------
Statement CaricaUnProgetto{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
MaxLen P$=160
MaxLen F$=64
ProgettoAperto$=FileRequest$("Load AmySequencer project",P$,F$)
If ProgettoAperto$<>""
For ProgettoAperto.b=0 To 4
If ProgettoAperto$=ProgettoAperto$(ProgettoAperto) Then Statement Return
Next ProgettoAperto
For ProgettoAperto=3 To 0 Step -1
ProgettoAperto$(ProgettoAperto+1)=ProgettoAperto$(ProgettoAperto)
Next ProgettoAperto
ProgettoAperto$(0)=ProgettoAperto$
StoriaDeiProgettiAperti=WriteFile(0,"ProjectsHistory")
If StoriaDeiProgettiAperti=True
FileOutput 0
For ProgettoAperto=0 To 4
If ProgettoAperto$(ProgettoAperto)<>""
NPrint ProgettoAperto$(ProgettoAperto)
EndIf
Next ProgettoAperto
CloseFile 0
PopOutput
VoceMenuEsci+1
EndIf
EndIf
End Statement
;-----------------------------------------------------------
;questa procedura imposta i suoni da usare con il programma
;this procedure sets sounds to use with program
;-----------------------------------------------
Statement EditoreSuoni{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED PercorsoSuoni$
SHARED Suono()
SHARED XLunSlider
SHARED YLunSlider
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
MenuTitle #ListaMenuEditoreSuoni,0,"Sounds"
MenuItem #ListaMenuEditoreSuoni,0,0,0,"Load"
MenuItem #ListaMenuEditoreSuoni,0,0,1,"Discard"
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1
LarghezzaInternaFinestraEditoreSuoni.w=InnerWidth
AltezzaInternaFinestraEditoreSuoni.w=InnerHeight
CloseWindow #FinestraEditoreSuoni
;-------------------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare i suoni disponibili
;sets the slider that is used to show the available sounds
;_---------------------------------------------------------
XLunSlider=16
YLunSlider=AltezzaInternaFinestraEditoreSuoni
ImpostaSlider{1,LarghezzaInternaFinestraEditoreSuoni-16,0,"VERTICAL",0,#ListaGadgetEditoreSuoni}
Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1,#ListaGadgetEditoreSuoni
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuEditoreSuoni
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #DueColoriConSfondoPieno
;----------------------------------
;sounds window's displaying start
;----------------------------------
InizioSuoni.b=0
;------------------------
;maximum strings length
;------------------------
LunghezzaMassimaStringhe.b=(LarghezzaInternaFinestraEditoreSuoni-16)/8
;-----------------------------
;stated by mouse sound number
;-----------------------------
SuonoIndicatoDalTopo.b=-1
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
MostraSlider{1,InizioSuoni,2,"VERTICAL",#ListaGadgetEditoreSuoni,#FinestraEditoreSuoni}
Repeat
If SecondoClicDelTopo.b=False
WCls
If SuoniCaricati.b>31 Then Enable #ListaGadgetEditoreSuoni,1 Else Disable #ListaGadgetEditoreSuoni,1
Redraw #FinestraEditoreSuoni,1
WLocate 0,0
;----------------------
;loaded sounds counter
;----------------------
SuoniCaricati=0
For Suono.b=0 To 30
AssegnamentoSuono$=Suono(InizioSuoni+Suono)\Nome
If AssegnamentoSuono$<>""
CanaleSuono.b=Suono(InizioSuoni+Suono)\Canale
If CanaleSuono>0 Then WColour CanaleSuono-1,16-CanaleSuono Else WColour 1,0
Format "00"
If CanaleSuono>0 Then CanaleSuono$=" channel "+Str$(CanaleSuono) Else CanaleSuono$=" no channel"
Format""
AssegnamentoSuono$+CanaleSuono$
AssegnamentoSuono$=Right$(AssegnamentoSuono$,LunghezzaMassimaStringhe)
AssegnamentoSuono$+SPACE$(LunghezzaMassimaStringhe-Len(AssegnamentoSuono$))
NPrint AssegnamentoSuono$
SuoniCaricati+1
EndIf
Next Suono
SecondoClicDelTopo=True
EndIf
EventoFinestraEditoreSuoni.l=WaitEvent
Select EventoFinestraEditoreSuoni
Case #HaiPremutoUnTastoDelTopo
TastoCliccatoDelTopo.b=MButtons:YTopo=WMouseY
Select TastoCliccatoDelTopo
Case 1
SuonoIndicatoDalTopo=YTopo/8+InizioSuoni
If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati
CanaleSuono.b=Suono(SuonoIndicatoDalTopo)\Canale
CanaleSuono+1:If CanaleSuono=17 Then CanaleSuono=0
Suono(SuonoIndicatoDalTopo)\Canale=CanaleSuono
EndIf
SecondoClicDelTopo=False
Case 5
SecondoClicDelTopo=True
End Select
; Case #HaiPremutoUnGadget
; If SuoniCaricati>31
; AltezzaSlider.w=
; InizioSuoni=ValoreSlider{1,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
; EndIf
; SecondoClicDelTopo=False
Case #HaiRilasciatoUnGadget
If SuoniCaricati>31
InizioSuoni=ValoreSlider{1,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
EndIf
SecondoClicDelTopo=False
Case #HaiAttivatoIlMenu
If MenuHit=0 AND ItemHit=0
If SuoniCaricati<32
MaxLen PercorsoSuoni$=160
MaxLen NomeSuono$=64
NomeSuono$=FileRequest$("Load a sound...",PercorsoSuoni$,NomeSuono$)
If NomeSuono$<>""
StessoSuono.b=False
If SuoniCaricati>0
For SuonoPrecedente=0 To SuoniCaricati-1
If NomeSuono$=Suono(SuonoPrecedente)\Nome Then StessoSuono=True
Next SuonoPrecedente
EndIf
If StessoSuono=False
Suono=SuoniCaricati
LoadSound Suono,NomeSuono$
Suono(Suono)\Nome=NomeSuono$
Sound Suono,3
EndIf
EndIf
EndIf
EndIf
If MenuHit=0 AND ItemHit=1
If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati AND SuonoIndicatoDalTopo>-1
Suono=SuonoIndicatoDalTopo
Free Sound Suono
Suono(Suono)\Nome=""
While Suono+1<SuoniCaricati
Suono(Suono)\Nome=Suono(Suono+1)\Nome
Suono(Suono)\Canale=Suono(Suono+1)\Canale
Suono+1
Wend
Suono(Suono)\Nome=""
Suono(Suono)\Canale=0
SuonoIndicatoDalTopo=-1
EndIf
EndIf
SecondoClicDelTopo=False
Case #HaiChiusoLaFinestra
SuoniAssegnatiAlloStessoCanale.b=False
For SuonoUno.b=0 To 31
For SuonoDue.b=0 To 31
If SuonoUno<>SuonoDue
If Suono(SuonoUno)\Canale>0 AND Suono(SuonoUno)\Canale=Suono(SuonoDue)\Canale
SuoniAssegnatiAlloStessoCanale=True
EndIf
EndIf
Next SuonoDue
Next SuonoUno
If SuoniAssegnatiAlloStessoCanale=True
Messaggio$="You have two or more sounds|assigned to the same channel;|please adjust all better!"
EZRequest "AmySequencer message",Messaggio$,"OK"
SecondoClicDelTopo=False
Else
EsciDallEditoreSuoni.b=True
EndIf
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$)
Select TastoPremuto$
Case TastoEsc$
EsciDallEditoreSuoni=True
Case TastoCursoreSu$
Case TastoCursoreGiu$
End Select
SecondoClicDelTopo=False
End Select
Until EsciDallEditoreSuoni=True
CloseWindow #FinestraEditoreSuoni
Use Window #FinestraPrincipale
WJam #UnColoreConSfondoTrasparente
End Statement
;-----------------------------------------------------
;questa procedura cancella a video un evento musicale
;this procedure clears on screen a musical event
;------------------------------------------------
Statement CancellaUnEventoMusicale{TipoDiEvento$,Evento.b,InizioEvento.l,DurataEvento.l,ModoDisegno.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
Select TipoDiEvento$
Case "Note"
NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
InizioNota.l=InizioEvento:FineNota.l=InizioNota+DurataEvento-1
I.w=16+InizioNota/ScalaNote-XInizioAreaVisibile
F.w=16+FineNota/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
InizioNotaVisibile.b=True
Else
InizioNotaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
FineNotaVisibile.b=True
Else
FineNotaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
NotaVisibile.b=True
Else
If InizioNotaVisibile=True OR FineNotaVisibile=True
NotaVisibile=True
Else
NotaVisibile=False
EndIf
EndIf
If NotaVisibile=True
X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
If TipoDiNota(Nota)\Diesis=True
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,0
Else
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,3
EndIf
EndIf
EndIf
Case "Program"
FineProgramma.l=InizioEvento+Len("Program000")*8-1
If ModoDisegno=#EventoSelezionato Then FineProgramma+Len("X")*8
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
F.w=16+FineProgramma-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Programma.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
For Linea.b=0 To 7
Y.w=Programma+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineProgramma,Y,0
Else
Wline I,Y,FineProgramma,Y,3
EndIf
Next Linea
EndIf
Case "Control"
FineControllo.l=InizioEvento+Len("Control000")*8-1
If ModoDisegno=#EventoSelezionato Then FineControllo+Len("X")*8
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
F.w=16+FineControllo-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Controllo.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
For Linea.b=0 To 7
Y.w=Controllo+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineControllo,Y,0
Else
Wline I,Y,FineControllo,Y,3
EndIf
Next Linea
EndIf
Case "Tempo"
FineTempo.l=InizioEvento+Len("Tempo=00/00")*8-1
If ModoDisegno=#EventoSelezionato Then FineTempo+Len("X")*8
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
F.w=16+FineTempo-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Tempo.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
For Linea.b=0 To 7
Y.w=Controllo+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineTempo,Y,0
Else
Wline I,Y,FineTempo,Y,3
EndIf
Next Linea
EndIf
End Select
End Statement
;--------------------------------------------
;questa procedura disegna un evento musicale
;this procedure draws a musical events
;--------------------------------------
Statement DisegnaUnEventoMusicale{TipoDiEvento$,Evento.b,InizioEvento.l,DurataEvento.l,CanaleEvento.b,ModoDisegno.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
Select TipoDiEvento$
Case "Note"
NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
FineNota.l=InizioEvento+DurataEvento-1
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
F.w=16+FineNota/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
InizioNotaVisibile.b=True
Else
InizioNotaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
FineNotaVisibile.b=True
Else
FineNotaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
NotaVisibile.b=True
Else
If InizioNotaVisibile=True OR FineNotaVisibile=True
NotaVisibile=True
Else
NotaVisibile=False
EndIf
EndIf
If NotaVisibile=True
X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,16-CanaleEvento
If ModoDisegno=#EventoSelezionato
Wline X0Nota,NotaVisualizzata,X1Nota,NotaVisualizzata+7,CanaleEvento-1
Wline X0Nota,NotaVisualizzata+7,X1Nota,NotaVisualizzata,CanaleEvento-1
EndIf
If ModoDisegno=#EventoNonSelezionato
Wline X0Nota+1,NotaVisualizzata+1,X1Nota-1,NotaVisualizzata+1,CanaleEvento-1
Wline X0Nota+1,NotaVisualizzata+6,X1Nota-1,NotaVisualizzata+6,CanaleEvento-1
EndIf
If ModoDisegno=#EventoNonSelezionato
If InizioNotaVisibile=True
Wline I+1,NotaVisualizzata+1,I+1,NotaVisualizzata+6,CanaleEvento-1
EndIf
If FineNotaVisibile=True
Wline F-1,NotaVisualizzata+1,F-1,NotaVisualizzata+6,CanaleEvento-1
EndIf
EndIf
EndIf
EndIf
Case "Program"
FineProgramma.l=InizioEvento+Len("Program000")*8-1
If ModoDisegno=#EventoSelezionato Then FineProgramma+Len("X")*8
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
F.w=16+FineProgramma-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
WColour CanaleEvento-1,16-CanaleEvento
Format "000":Programma$="Program"+Str$(Evento):Format ""
If ModoDisegno=#EventoSelezionato Then Programma$+"X"
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Y.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
WLocate I,Y:Print Left$(Right$(Programma$,(F-16+1)/8),(F-I+1)/8)
EndIf
Case "Control"
FineControllo.l=InizioEvento+Len("Control000")*8-1
If ModoDisegno=#EventoSelezionato Then FineControllo+Len("X")*8
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
F.w=16+FineControllo-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
WColour CanaleEvento-1,16-CanaleEvento
Format "000":Controllo$="Control"+Str$(Evento):Format ""
If ModoDisegno=#EventoSelezionato Then Controllo$+"X"
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Y.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
WLocate I,Y:Print Left$(Right$(Controllo$,(F-16+1)/8),(F-I+1)/8)
EndIf
Case "Tempo"
FineTempo.l=InizioEvento+Len("Tempo=00/00")*8-1
If ModoDisegno=#EventoSelezionato Then FineTempo+Len("X")*8
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
F.w=16+FineTempo-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
WColour CanaleEvento-1,16-CanaleEvento:Format"00"
Tempo$="Tempo="+Str$(Evento MOD 16+1)+"/"+Str$(Evento/16+1):Format ""
If ModoDisegno=#EventoSelezionato Then Tempo$+"X"
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Y.w=AreaVisibileDeiValori*Max((127-Evento+1),0)/127
WLocate I,Y:Print Left$(Right$(Tempo$,(F-16+1)/8),(F-I+1)/8)
EndIf
End Select
End Statement
;-----------------------------------------------------------
;questa procedura disegna le note di sfondo con i loro nomi
;this procedure draws the notes background with note names
;----------------------------------------------------------
Statement MostraLeNoteDiSfondoConILoroNomi{}
SHARED AreaInvisibileDelleNote
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED TipoDiNota()
SHARED YInizioAreaVisibile
For Tasto.b=0 To 127-AreaInvisibileDelleNote
Nota.b=127-Tasto-YInizioAreaVisibile
Y0Nota.w=Tasto*8:Y1Nota.w=Y0Nota+7
If TipoDiNota(Nota)\Diesis=True
WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,0
WColour 3,0
Else
WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,3
WColour 0,3
EndIf
WLocate 16,Y0Nota
Print "Note ",Nota,">"
Print TipoDiNota(Nota)\NomeInglese
Print "-"
Print TipoDiNota(Nota)\NomeItaliano
Print TipoDiNota(Nota)\Ottava
Next Tasto
End Statement
;-----------------------------------------------
;questa procedura mostra i numeri delle battute
;this procedure shows the bar numbers
;-------------------------------------
Statement MostraLeBattute{}
SHARED AreaInvisibileDelleNote
SHARED Battiti
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
Nota.b=127-YInizioAreaVisibile-(127-AreaInvisibileDelleNote)
Nota$=Str$(Nota):OttavaNota$=Str$(TipoDiNota(Nota)\Ottava):NomeIngleseNota$=TipoDiNota(Nota)\NomeInglese
NomeItalianoNota$=TipoDiNota(Nota)\NomeItaliano
LarghezzaTesto.w=Len("Note "+Nota$+">"+NomeIngleseNota$+"-"+NomeItalianoNota$+OttavaNota$+" ")*8
If TipoDiNota(Nota)\Diesis=True Then WColour 3,0 Else WColour 0,3
ScostamentoBattute.w=XInizioAreaVisibile MOD 192
FineTempoVisibile.l=XInizioAreaVisibile+(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaNote
TempoVisibile.l=XInizioAreaVisibile
ResetList EventoMusicale()
Repeat
XTempo.w=(TempoVisibile-XInizioAreaVisibile-ScostamentoBattute)/ScalaNote
If XTempo>LarghezzaTesto
While NextItem(EventoMusicale())=True
If EventoMusicale()\Tipo="Tempo"
If EventoMusicale()\Sequenza=SequenzaSelezionata AND EventoMusicale()\Inizio<=TempoVisibile
NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
NuoveMisure.b=EventoMusicale()\Evento/16+1
TempoCambiato.b=True
EndIf
EndIf
Wend
WLocate XTempo,(127-AreaInvisibileDelleNote)*8
If TempoCambiato=True
ConvertiIlTempoInBattute{TempoVisibile-ScostamentoBattute,NuoviBattiti,NuoveMisure,False}
Else
ConvertiIlTempoInBattute{TempoVisibile-ScostamentoBattute,Battiti,Misure,False}
EndIf
EndIf
If TempoCambiato=True
IncrementoTempoVisibile.w=(192*(4.0/NuoveMisure))*Max(ScalaNote/4,1)
Else
IncrementoTempoVisibile.w=(192*(4.0/Misure))*Max(ScalaNote/4,1)
EndIf
TempoVisibile+IncrementoTempoVisibile
Until TempoVisibile>FineTempoVisibile
End Statement
;-----------------------------------------------------
;questa procedura mostra gli slider dell'editore note
;this procedure shows the notes editor' sliders
;-----------------------------------------------
Statement MostraSliderEditoreSequenza{}
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED DurataSequenza
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
MostraSlider{1,YInizioAreaVisibile,AreaInvisibileDelleNote,"VERTICAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
AreaInvisibileDelTempo=DurataSequenza/ScalaNote-(LarghezzaInternaFinestraEditoreSequenza-16)
AreaInvisibileDelTempo=Max(AreaInvisibileDelTempo,0)
If AreaInvisibileDelTempo=0
Disable #ListaGadgetEditoreSequenza,2
XInizioAreaVisibile=0
Else
Enable #ListaGadgetEditoreSequenza,2
EndIf
Redraw #FinestraEditoreSequenza,2
MostraSlider{2,XInizioAreaVisibile,AreaInvisibileDelTempo,"HORIZONTAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
End Statement
;--------------------------------------------
;questa procedura mostra gli eventi musicali
;this procedure shows musical events
;------------------------------------
Statement MostraGliEventiMusicali{}
SHARED EventoMusicale()
SHARED SequenzaSelezionata
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
TipoDiEvento$=EventoMusicale()\Tipo
If EventoMusicale()\Sequenza=SequenzaSelezionata
InizioEvento.l=EventoMusicale()\Inizio
CanaleEvento.b=EventoMusicale()\Canale
If EventoMusicale()\Selezionato=True
Select TipoDiEvento$
Case "Note"
Nota.b=EventoMusicale()\Evento:DurataNota.l=EventoMusicale()\Durata
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoSelezionato}
Case "Program"
Programma.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,#EventoSelezionato}
Case "Control"
Controllo.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,#EventoSelezionato}
Case "Tempo"
Tempo.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Tempo",Tempo,InizioEvento,0,CanaleEvento,#EventoSelezionato}
End Select
Else
Select TipoDiEvento$
Case "Note"
Nota=EventoMusicale()\Evento:DurataNota=EventoMusicale()\Durata
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoNonSelezionato}
Case "Program"
Programma=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
Case "Control"
Controllo=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
Case "Tempo"
Tempo=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Tempo",Tempo,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
End Select
EndIf
EndIf
Wend
End Statement
;---------------------------------------------------------------
;questa procedura mostra la scala di visualizzazione delle note
;this procedure shows the note scale of notes displaying
;--------------------------------------------------------
Statement MostraLaScalaDelleNote{}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED ColoriOriginali
SHARED ScalaNote
; For Scatola.b=0 To 4
; Y0Scatola.w=AltezzaInternaFinestraEditoreSequenza-8-8
; WBox Scatola,Y0Scatola+Scatola,15-Scatola,Y0Scatola+7-Scatola,15-Scatola
; Next Scatola
Select ScalaNote
Case 1
Ingrandimento.b=1
Case 2
Ingrandimento=2
Case 4
Ingrandimento=3
Case 8
Ingrandimento=4
Case 16
Ingrandimento=5
Case 32
Ingrandimento=6
End Select
WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
If ColoriOriginali=True Then WColour 1,0 Else WColour 2,1
Print "Z",Ingrandimento
End Statement
Statement MostraITastiDaUsare{}
MostraITastiDaUsare$="Space>.......move sequence end forward|"
MostraITastiDaUsare$+"No selected events:|"
MostraITastiDaUsare$+"Cursor up>...scroll window up|"
MostraITastiDaUsare$+"Cursor down>.scroll window down|"
MostraITastiDaUsare$+"Cursor left>.scroll window forward|"
MostraITastiDaUsare$+"Cursor right>scroll window backward|"
MostraITastiDaUsare$+"Backspace>...delete last event|"
MostraITastiDaUsare$+"with selected events:|"
MostraITastiDaUsare$+"Cursor up>...inc sel events/tempo beat|"
MostraITastiDaUsare$+"Cursor down>.dec sel events/tempo beat|"
MostraITastiDaUsare$+"Cursor left>.move sel events forward|"
MostraITastiDaUsare$+"Cursor right>move sel events backward|"
MostraITastiDaUsare$+"with selected events plus shift:|"
MostraITastiDaUsare$+"Cursor up>...move sel notes up of one octave|"
MostraITastiDaUsare$+" inc sel events of 10|"
MostraITastiDaUsare$+" inc sel tempo events measure|"
MostraITastiDaUsare$+"Cursor down> move sel notes down of one octave|"
MostraITastiDaUsare$+" dec sel events of 10|"
MostraITastiDaUsare$+" dec sel tempo events measure|"
MostraITastiDaUsare$+"Cursor left>.stretch sel notes forward|"
MostraITastiDaUsare$+"Cursor right>stretch sel notes backward|"
MostraITastiDaUsare$+"Backspace>...delete all sel events|"
MostraITastiDaUsare$+"Esc>.........leave the editor"
EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"
End Statement
Statement MostraLaMappaturaDelleNoteSullaTastiera{}
MostraLaMappaturaDelleNoteSullaTastiera$="Note lo octave hi octave|"
MostraLaMappaturaDelleNoteSullaTastiera$+"C--Do >........Z.........Q|"
MostraLaMappaturaDelleNoteSullaTastiera$+"C#-Do# >........S.........2|"
MostraLaMappaturaDelleNoteSullaTastiera$+"D--Re >........X.........W|"
MostraLaMappaturaDelleNoteSullaTastiera$+"D#-Re# >........D.........3|"
MostraLaMappaturaDelleNoteSullaTastiera$+"E--Mi >........C.........E|"
MostraLaMappaturaDelleNoteSullaTastiera$+"F--Fa >........V.........R|"
MostraLaMappaturaDelleNoteSullaTastiera$+"F#-Fa# >........G.........5|"
MostraLaMappaturaDelleNoteSullaTastiera$+"G--Sol >........B.........T|"
MostraLaMappaturaDelleNoteSullaTastiera$+"G#-Sol#>........H.........6|"
MostraLaMappaturaDelleNoteSullaTastiera$+"A--La >........N.........Y|"
MostraLaMappaturaDelleNoteSullaTastiera$+"A#-La# >........J.........7|"
MostraLaMappaturaDelleNoteSullaTastiera$+"B--Si >........M.........U|"
MostraLaMappaturaDelleNoteSullaTastiera$+"|"
MostraLaMappaturaDelleNoteSullaTastiera$+"function keys to select octave"
EZRequest "AmySequencer help",MostraLaMappaturaDelleNoteSullaTastiera$,"OK"
End Statement
;---------------------------------------------------
;questa procedura permette di cambiare la nota base
;this procedure permits to change the basic note
;------------------------------------------------
Statement CambiaLEventoDiBase{}
SHARED AltezzaFonte
SHARED ColoriOriginali
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoDiBase
SHARED TastoCursoreDestra$
SHARED TastoCursoreSinistra$
SHARED TastoEsc$
SHARED TipoDiEvento$
SHARED ValoreEventoDiBase
SHARED XLunSlider
SHARED YLunSlider
TipoFinestra.l=#FinestraMovibile+#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
YPosF.w=(AltezzaFonte+3)*2
YLunF.w=AltezzaFonte+3+16+8+8+2:If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo" Then YLunF+8+8
TitoloFinestra$="Basic event: "+LCase$(TipoDiEvento$)
Window #FinestraCambioEventoBase,4,YPosF,4+24*9+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
LarghezzaInternaFinestraCambioEventoBase.w=InnerWidth
AltezzaInternaFinestraCambioEventoBase.w=InnerHeight
CloseWindow #FinestraCambioEventoBase
XLunSlider=LarghezzaInternaFinestraCambioEventoBase
YLunSlider=8
If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo"
ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
Else
ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
EndIf
Window #FinestraCambioEventoBase,4,YPosF,4+24*9+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetCambioEventoBase
WindowFont #FonteDiCaratteriTopaz8
; Zona.b=NewZoneTable(#TabellaZoneCambioEventoBase,9)
; If Zona=True Then UseZoneTable #TabellaZoneCambioEventoBase Else Statement Return
; UseZoneTable #TabellaZoneEditoreSequenza
For Zona.b=0 To 7
WBlit Zona,24*Zona,0;:SetZone Zona,24*Zona,0,24*Zona+23,15
Next
WLocate 24*8+8,4:WColour 1,0:Print "3";:SetZone 8,24*8,0,24*8+23,15
MostraSlider{1,(LarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo"
MostraSlider{2,ValoreEventoDiBase,127,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
EndIf
NuovaLarghezzaEventoDiBase.w=LarghezzaEventoDiBase
NuovoValoreEventoDiBase.b=ValoreEventoDiBase
EventoBaseDiModificato.b=False
Repeat
ResetTimer
If SecondoClicDelTopo.b=False
If TipoDiEvento$="Program" OR TipoDiEvento$="Tempo"
WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
Else
WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8
EndIf
If NuovaLarghezzaEventoDiBase MOD 6=0
If ColoriOriginali=True Then WColour 3,2 Else WColour 10,9
Else
WColour 2,1
EndIf
Format "0000":Print NuovaLarghezzaEventoDiBase:Format "":Print SPACE$(18)+"width"
If TipoDiEvento$<>"Program" AND TipoDiEvento$<>"Tempo"
WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
WColour 1,0:Format "000":Print NuovoValoreEventoDiBase:Format ""
If TipoDiEvento$="Note" Then Valore$="velocity"
If TipoDiEvento$="Control" Then Valore$="value"
Print SPACE$(24-Len(Valore$)),Valore$
EndIf
SecondoClicDelTopo=True
EndIf
EventoFinestraCambioEventoBase.l=WaitEvent
TempoTrascorso.l=Timer
Select EventoFinestraCambioEventoBase
Case #HaiPremutoUnTastoDelTopo
XTopo.w=WMouseX:YTopo.w=WMouseY:TastoCliccatoDelTopo.b=MButtons
Select TastoCliccatoDelTopo
Case 1
XZonaTopo.b=XTopo/24:YZonaTopo.b=YTopo>=0 AND YTopo<16
If YZonaTopo=True
Select XZonaTopo
Case 0
NuovaLarghezzaEventoDiBase=192*4:NotaPuntata.w=0:Terzina.b=0
Speak "You have choosen a whole note width"
Case 1
NuovaLarghezzaEventoDiBase=192*2:NotaPuntata=0:Terzina=0
Speak "You have choosen a half note width"
Case 2
NuovaLarghezzaEventoDiBase=192:NotaPuntata=0:Terzina=0
Speak "You have choosen a quarter note width"
Case 3
NuovaLarghezzaEventoDiBase=192/2:NotaPuntata=0:Terzina=0
Speak "You have choosen an eighth note width"
Case 4
NuovaLarghezzaEventoDiBase=192/4:NotaPuntata=0:Terzina=0
Speak "You have choosen a sixteenth note width"
Case 5
NuovaLarghezzaEventoDiBase=192/8:NotaPuntata=0:Terzina=0
Speak "You have choosen a thirty second note width"
Case 6
NuovaLarghezzaEventoDiBase=192/16:NotaPuntata=0:Terzina=0
Speak "You have choosen a sixty fourth note width"
Case 7
If NotaPuntata=0
NotaPuntata=NuovaLarghezzaEventoDiBase/2
NuovaLarghezzaEventoDiBase+NotaPuntata
If Terzina>0
Terzina=0
Speak "You have no more a triplet note width, you have choosen a dotted note width"
Else
Speak "You have choosen a dotted note width"
EndIf
Else
NuovaLarghezzaEventoDiBase/3*2
NotaPuntata=0
Speak "You have no more a dotted note width"
EndIf
Case 8
If Terzina=0 AND NuovaLarghezzaEventoDiBase>5
Terzina=3:NuovaLarghezzaEventoDiBase/Terzina
If NotaPuntata>0
NotaPuntata=0
Speak "You have no more a dotted note width, you have choosen a triplet note width"
Else
Speak "You have choosen a triplet note width"
EndIf
Else
NuovaLarghezzaEventoDiBase*Terzina:Terzina=0
Speak "You have no more a triplet note width"
EndIf
End Select
If XZonaTopo>=0 AND XZonaTopo<9
MostraSlider{1,(NuovaLarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
Speak ", that are "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
EndIf
EndIf
SecondoClicDelTopo=False
Case 5
SecondoClicDelTopo=True
End Select
; Case #HaiPremutoUnGadget
; XLunSlider=LarghezzaInternaFinestraCambioEventoBase
; NuovaLarghezzaEventoDiBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
Case #HaiRilasciatoUnGadget
Select GadgetHit
Case 1
XLunSlider=LarghezzaInternaFinestraCambioEventoBase
NuovaLarghezzaEventoDiBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
NotaPuntata=0:Terzina=0
Speak "You have choosen a note width of "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
Case 2
XLunSlider=LarghezzaInternaFinestraCambioEventoBase
NuovoValoreEventoDiBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
Speak "You have choosen a note velocity of "+Str$(NuovoValoreEventoDiBase)+"."
End Select
SecondoClicDelTopo=False
Case #HaiChiusoLaFinestra
EsciDalCambioEventoBase=True
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$)
Select TastoPremuto$
Case TastoEsc$
EsciDalCambioEventoBase=True
Case TastoCursoreDestra$
If NuovaLarghezzaEventoDiBase<192*6-2
NuovaLarghezzaEventoDiBase+2:NotaPuntata=0:Terzina=0
MostraSlider{1,(NuovaLarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
If TempoTrascorso>99 Then Speak "You have choosen a note width of "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
EndIf
Case TastoCursoreSinistra$
If NuovaLarghezzaEventoDiBase>3
NuovaLarghezzaEventoDiBase-2:NotaPuntata=0:Terzina=0
MostraSlider{1,(NuovaLarghezzaEventoDiBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
If TempoTrascorso>99 Then Speak "You have choosen a note width of "+Str$(NuovaLarghezzaEventoDiBase)+" ticks."
EndIf
End Select
SecondoClicDelTopo=False
End Select
Until EsciDalCambioEventoBase=True
If NuovaLarghezzaEventoDiBase<>LarghezzaEventoDiBase Then EventoDiBaseModificato=True
If NuovoValoreEventoDiBase<>ValoreEventoDiBase Then EventoDiBaseModificato=True
LarghezzaEventoDiBase=NuovaLarghezzaEventoDiBase:ValoreEventoDiBase=NuovoValoreEventoDiBase
If EventoDiBaseModificato=True AND EventiSelezionati>0
Messaggio$="You have made changes:|"
Messaggio$="Would you apply these to the selected events?"
ApplicaINuoviValoriAgliEventiSelezionati.b=EZRequest("AmySequencer message",Messaggio$,"Yes|No")
If ApplicaINuoviValoriAgliEventiSelezionati=1
Select TipoDiEvento$
Case "Note"
AggiustaInizio.b=EZRequest("AmySequencer message","Quantize notes start?","Yes|No")
AggiustaDurata.b=EZRequest("AmySequencer message","Quantize notes length?","Yes|No")
AggiustaValore.b=EZRequest("AmySequencer message","Change notes velocity?","Yes|No")
Case "Program"
AggiustaInizio.b=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
Case "Control"
AggiustaInizio.b=EZRequest("AmySequencer message","Quantize controls start?","Yes|No")
AggiustaValore.b=EZRequest("AmySequencer message","Change controls value?","Yes|No")
Case "Tempo"
AggiustaInizio.b=EZRequest("AmySequencer message","Quantize tempo events start?","Yes|No")
End Select
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True
Select EventoMusicale()\Tipo
Case "Note"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase*LarghezzaEventoDiBase
If AggiustaDurata=1 Then EventoMusicale()\Durata=LarghezzaEventoDiBase
If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoDiBase
Case "Program"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase
Case "Control"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase
If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoDiBase
Case "Tempo"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoDiBase
End Select
EndIf
Wend
EndIf
EndIf
;*************************************************************
;la seguente linea se attivata da' errore quando non dovrebbe
;the following line if avtivated gives an error when it should not do
;*********************************************************************
; FreeZoneTable(#TabellaZoneCambioEventoBase)
CloseWindow #FinestraCambioEventoBase
Use Window #FinestraEditoreSequenza
;***************************************************
;il seguente comando sembra non avere alcun effetto
;the following command seems have no effect
;*******************************************
; UseZoneTable #TabellaZoneEditoreSequenza
End Statement
;---------------------------------------------------------------
;this procedure states the selected by mouse event new position
;questa procedura mostra la nuova posizione dell'evento selezionato col mouse
;-----------------------------------------------------------------------------
Statement MostraNuovaPosizioneEvento{XEvento.l,YEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaEventoDiBase
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraNuovoValore
SHARED ScalaNote
SHARED TipoDiEvento$
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
X0.w=16+XEvento/ScalaNote-XInizioAreaVisibile
Select TipoDiEvento$
Case "Note"
Y0.w=(127-YInizioAreaVisibile-YEvento)*8
X1.w=X0+(LarghezzaEventoDiBase-1)/ScalaNote
Case "Program"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Program000X")*8-1
Case "Control"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Control000X")*8-1
Case "Tempo"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Tempo=00/00X")*8-1
End Select
Y1.w=Y0+7
X0=Min(Max(X0,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0=Min(Max(Y0,0),AltezzaInternaFinestraEditoreSequenza-1-8-8-7)
X1=Min(Max(X1,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1=Min(Max(Y1,7),AltezzaInternaFinestraEditoreSequenza-1-8-8)
WJam #SecondaVoltaStessoColore
If MostraNuovoValore=True
WLocate X0,Y0
Select TipoDiEvento$
Case "Note"
Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
Case "Program"
Format "000":Print "Program",Str$(YEvento),"X":Format ""
Case "Control"
Format "000":Print "Control",Str$(YEvento),"X":Format ""
Case "Tempo"
Format "00":Print "Tempo=",Str$(YEvento MOD 16+1),"/",Str$(YEvento/16+1):Format ""
End Select
Else
Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
EndIf
WJam #DueColoriConSfondoPieno
End Statement
;---------------------------------------------------------------------------
;questa procedura permette di spostare le nota selezionate cliccando con il
; mouse su una di esse
;this procedure permits to move the selected notes clicking on one of these
;---------------------------------------------------------------------------
Statement MuoviGliEventiSelezionatiConIlTopo{XPosizioneEvento.l,YPosizioneEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaEventoDiBase
SHARED Misure
SHARED MostraNuovoValore
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED XPosizioneNota
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
PrimoSpostamento.b=True
Repeat
NuovaXTopo.w=WMouseX:NuovaYTopo.w=WMouseY
TastoPremutoDelTopo=Joyb(0)
TipoDiEvento$=EventoMusicale()\Tipo
InizioEvento.l=EventoMusicale()\Inizio
CanaleEvento.b=EventoMusicale()\Canale
Select TipoDiEvento$
Case "Note"
XNuovaPosizioneNota.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YNuovaPosizioneNota.b=127-YInizioAreaVisibile-NuovaYTopo/8
If XNuovaPosizioneNota<>XPosizioneEvento
IncrementoXEventoMusicale.l=XNuovaPosizioneNota-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
If YNuovaPosizioneNota<>YPosizioneEvento
IncrementoYEventoMusicale.b=YNuovaPosizioneNota-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Note>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "Program"
XNuovaPosizioneProgramma.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YNuovaPosizioneProgramma.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizioneProgramma<0
If NuovaYTopo<0 Then YNuovaPosizioneProgramma=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneProgramma=0
EndIf
If XNuovaPosizioneProgramma<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneProgramma-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
If YNuovaPosizioneProgramma<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneProgramma-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Program>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "Control"
XNuovaPosizioneControllo.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YNuovaPosizioneControllo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizioneControllo<0
If NuovaYTopo<0 Then YNuovaPosizioneControllo=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneControllo=0
EndIf
If XNuovaPosizioneControllo<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneControllo-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
If YNuovaPosizioneControllo<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneControllo-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Control>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "Tempo"
XNuovaPosizioneTempo.l=((XInizioAreaVisibile+NuovaXTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YNuovaPosizioneTempo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizioneTempo<0
If NuovaYTopo<0 Then YNuovaPosizioneTempo=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneTempo=0
EndIf
If XNuovaPosizioneTempo<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneTempo-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
If YNuovaPosizioneTempo<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneTempo-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
NuoviBattiti.b=IncrementoYEventoMusicale MOD 16
NuoveMisure.b=Abs(IncrementoYEventoMusicale/16)
Messaggio$="Tempo=":If Sgn(IncrementoYEventoMusicale)=-1 Then Messaggio$+"-"
Messaggio$+Str$(NuoviBattiti)+"/"+Str$(NuoveMisure)
EndIf
End Select
Select TipoDiEvento$
Case "Note"
NuovaXEvento.l=XNuovaPosizioneNota:NuovaYEvento.b=YNuovaPosizioneNota
Case "Program"
NuovaXEvento=XNuovaPosizioneProgramma:NuovaYEvento=YNuovaPosizioneProgramma
Case "Control"
NuovaXEvento=XNuovaPosizioneControllo:NuovaYEvento=YNuovaPosizioneControllo
Case "Tempo"
NuovaXEvento=XNuovaPosizioneTempo:NuovaYEvento=YNuovaPosizioneTempo
End Select
MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
If EventoMusicaleSpostatoConIlTopo=False
Messaggio$="No change made"
EndIf
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
WLocate XMessaggio,YMessaggio
Print SPACE$(80-XMessaggio/8)
WLocate XMessaggio,YMessaggio
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Messaggio$
If EventoMusicaleSpostatoConIlTopo=True
Print " pos>":ConvertiIlTempoInBattute{IncrementoXEventoMusicale,Battiti,Misure,False}
EndIf
VWait
MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
Until TastoPremutoDelTopo<>#TastoSinistroDelTopoPremuto
If EventoMusicaleSpostatoConIlTopo=True
PushItem EventoMusicale()
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Sequenza=SequenzaSelezionata
If EventoMusicale()\Tipo=TipoDiEvento$ AND EventoMusicale()\Selezionato=True
EventoMusicale()\Evento+IncrementoYEventoMusicale
EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),127)
EventoMusicale()\Inizio+IncrementoXEventoMusicale
If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
EndIf
EndIf
Wend
PopItem EventoMusicale()
EndIf
End Statement
;----------------------------------------
;questa procedura suona la nota corrente
;this procedure plays the current note
;--------------------------------------
Statement SuonaLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED EventoMusicale()
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED Suono()
SHARED VoceSpenta
For Suono.b=0 To 31
If Suono(Suono)\Canale=CanaleNota Then Pop For:Goto FineCicloForEsecutoreNote
Next Suono
FineCicloForEsecutoreNote
If Suono<32
If Suono(Suono)\Canale>0
Periodo.l=PeriFreq(Nota)\Periodo
If Periodo>=#PeriodoMinimo AND Periodo<65536
If VoceSpenta>0
If VoceSpenta BitTst 0=True Then Voce.b=1:VoceSpenta BitClr 0:Goto SuonaCampione
If VoceSpenta BitTst 1=True Then Voce=2:VoceSpenta BitClr 1:Goto SuonaCampione
If VoceSpenta BitTst 2=True Then Voce=4:VoceSpenta BitClr 2:Goto SuonaCampione
If VoceSpenta BitTst 3=True Then Voce=8:VoceSPenta BitClr 3
EndIf
SuonaCampione
SetPeriod Suono,Periodo:Sound Suono,Voce
EventoMusicale()\VoceUsata=Voce
Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
EndIf
EndIf
Else
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_NoteOn+(CanaleNota-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Nota
WriteSerial 0,VelocitaNota
Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
NoteSuonate+1
EndIf
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleNota-1,16-CanaleNota
Print Messaggio$
EndIf
End Statement
;-----------------------------------------------
;questa procedura esegue il cambio di programma
;this procedure execute the program change
;------------------------------------------
Statement EseguiIlCambioDiProgramma{Programma,CanaleProgramma.b,Modo.b}
SHARED MIDIAttivato
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_ProgramChange+(CanaleProgramma-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Programma
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Program>"+Str$(Programma)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleProgramma-1,16-CanaleProgramma
Print Messaggio$
EndIf
End Statement
;-----------------------------------------------
;questa procedura esegue il cambio di controllo
;this procedure execute the control change
;------------------------------------------
Statement EseguiIlCambioDiControllo{Controllo,ValoreControllo,CanaleControllo.b,Modo.b}
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_ControlChange+(CanaleControllo-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Controllo
WriteSerial 0,ValoreControllo
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Control>"+Str$(Controllo)+" val>"+Str$(ValoreControllo)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleControllo-1,16-CanaleControllo
Print Messaggio$
EndIf
End Statement
;-----------------------------------------------------
;questa procedura interrompe la nota suonata corrente
;this procedure stops the current played note
;---------------------------------------------
Statement SmettiDiSuonareLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED EventoMusicale()
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED VoceSpenta
VoceUsata.b=EventoMusicale()\VoceUsata
If VoceUsata>0
Quiet VoceUsata
VoceSpenta OR VoceUsata
Else
If MIDIAttivato=True
ByteDiStatoMIDI=#_NoteOff+(CanaleNota-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Nota
WriteSerial 0,VelocitaNota
NoteSuonate-1
EndIf
EndIf
End Statement
;----------------------------------------------------------
;questa procedura interrompe l'esecuzione di tutte le note
;this procedure stops all notes execution
;-----------------------------------------
Statement InterrompiTutteLeNote{Modo.b}
WriteSerial 0,#_AllNotesOff
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="AllNotesOff"
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour 3,2
Print Messaggio$
EndIf
End Statement
;----------------------------------------------------------------------
;questa procedura imposta il menu della finestra dell'editore sequenza
;this procedure sets the sequence editor window menu
;----------------------------------------------------
Statement ImpostaMenuFinestraEditoreSequenza{}
SHARED MostraNuovoValore
SHARED TipoDiEvento$
Free MenuList #ListaMenuEditoreSequenza
MenuTitle #ListaMenuEditoreSequenza,0,"Controls"
MenuItem #ListaMenuEditoreSequenza,0,0,0,"Play"
MenuTitle #ListaMenuEditoreSequenza,1,"Event type"
Select TipoDiEvento$
Case "Note"
MenuItem #ListaMenuEditoreSequenza,4,1,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,1,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,1,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,1,3," Tempo"
Case "Program"
MenuItem #ListaMenuEditoreSequenza,2,1,0," Note"
MenuItem #ListaMenuEditoreSequenza,4,1,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,1,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,1,3," Tempo"
Case "Control"
MenuItem #ListaMenuEditoreSequenza,2,1,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,1,1," Program"
MenuItem #ListaMenuEditoreSequenza,4,1,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,1,3," Tempo"
Case "Tempo"
MenuItem #ListaMenuEditoreSequenza,2,1,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,1,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,1,2," Control"
MenuItem #ListaMenuEditoreSequenza,4,1,3," Tempo"
End Select
MenuTitle #ListaMenuEditoreSequenza,2,"Settings"
MenuItem #ListaMenuEditoreSequenza,0,2,0,"Basic event"
If MostraNuovoValore=True
MenuItem #ListaMenuEditoreSequenza,3,2,1," Show dragged event value"
Else
MenuItem #ListaMenuEditoreSequenza,1,2,1," Show dragged event value"
EndIf
MenuTitle #ListaMenuEditoreSequenza,3,"Help"
MenuItem #ListaMenuEditoreSequenza,0,3,0,"Keys to use"
MenuItem #ListaMenuEditoreSequenza,0,3,1,"Notes on keys"
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuEditoreSequenza
End Statement
;----------------------------------------------
;questa procedura modifica gli eventi musicali
;this procedure modifies the musical events
;-------------------------------------------
Statement Selezione{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED Eventi
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoDiBase
SHARED MIDIAttivato
SHARED Misure
SHARED NotaSuonata
SHARED PeriFreq()
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED Suono()
SHARED TipoDiEvento$
SHARED ValoreEventoDiBase
SHARED XInizioAreaVisibile
SHARED XPosizioneNota
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
SHARED YTopo
ResetList EventoMusicale()
StessoEvento.b=%00000
XTopo=Min(Max(XTopo,16),LarghezzaInternaFinestraEditoreSequenza-1)
While NextItem(EventoMusicale())=True
StessoEvento=%00000
TipoDiEventoSelezionato$=EventoMusicale()\Tipo
InizioEvento.l=EventoMusicale()\Inizio
CanaleEvento.b=EventoMusicale()\Canale
SequenzaEvento.w=EventoMusicale()\Sequenza
EventoSelezionato.b=EventoMusicale()\Selezionato
If Modo=#SelezionaUnEvento
Select TipoDiEventoSelezionato$
Case "Note"
YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
Nota.b=EventoMusicale()\Evento
DurataNota.l=EventoMusicale()\Durata
FineNota.l=InizioEvento+DurataNota-1
VelocitaNota.b=EventoMusicale()\Valore
XPosizioneNota=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YPosizioneNota=127-YInizioAreaVisibile-YTopo/8
If XPosizioneNota>=InizioEvento Then StessoEvento OR %00001
If XPosizioneNota<=FineNota Then StessoEvento OR %00010
If YPosizioneNota=Nota Then StessoEvento OR %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new note|with the current channel?","Yes|No")
If AggiungiEvento=0
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
StessoEvento OR %10000
EndIf
Else
TipoDiEvento$=TipoDiEventoSelezionato$
ImpostaMenuFinestraEditoreSequenza{}
StessoEvento OR %10000
EndIf
If EventoSelezionato=True
MuoviGliEventiSelezionatiConIlTopo{XPosizioneNota,YPosizioneNota}
If EventoMusicaleSpostatoConIlTopo=False
EventiSelezionati-1
EventoMusicale()\Selezionato=False
Else
Nota=EventoMusicale()\Evento
InizioNota=EventoMusicale()\Inizio
EndIf
Else
NotaPiuLunga.l=DurataNota
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
If NotaSuonata\Eseguito=True
SmettiDiSuonareLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
EndIf
SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
NotaSuonata\Evento=Nota,InizioNota,CanaleEvento
NotaSuonata\Durata=DurataNota,VelocitaNota
NotaSuonata\Eseguito=True
Pop While:Goto FineCicloWhile
EndIf
Case "Program"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
Programma.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Program000")*8
If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
FineProgramma.w=InizioEvento+LunghezzaEvento-1
XPosizioneProgramma.w=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YPosizioneProgramma.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneProgramma>=InizioEvento Then StessoEvento OR %00001
If XPosizioneProgramma<FineProgramma Then StessoEvento OR %00010
If YPosizioneProgramma=Programma Then StessoEvento OR %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new program|with the current channel?","Yes|No")
If AggiungiEvento=0
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
StessoEvento OR %10000
EndIf
Else
TipoDiEvento$=TipoDiEventoSelezionato$
ImpostaMenuFinestraEditoreSequenza{}
StessoEvento OR %10000
EndIf
If EventoSelezionato=True
MuoviGliEventiSelezionatiConIlTopo{XPosizioneProgramma,YPosizioneProgramma}
If EventoMusicaleSpostatoConIlTopo=False
EventiSelezionati-1
EventoMusicale()\Selezionato=False
EndIf
Else
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Pop While:Goto FineCicloWhile
EndIf
Case "Control"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
Controllo.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Control000")*8
If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
FineControllo.w=InizioEvento+LunghezzaEvento-1
XPosizioneControllo.w=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YPosizioneControllo.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneControllo>=InizioEvento Then StessoEvento OR %00001
If XPosizioneControllo<FineControllo Then StessoEvento OR %00010
If YPosizioneControllo=Controllo Then StessoEvento OR %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new control|with the current channel?","Yes|No")
If AggiungiEvento=0
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
StessoEvento OR %10000
EndIf
Else
TipoDiEvento$=TipoDiEventoSelezionato$
ImpostaMenuFinestraEditoreSequenza{}
StessoEvento OR %10000
EndIf
If EventoSelezionato=True
MuoviGliEventiSelezionatiConIlTopo{XPosizioneControllo,YPosizioneControllo}
If EventoMusicaleSpostatoConIlTopo=False
EventiSelezionati-1
EventoMusicale()\Selezionato=False
EndIf
Else
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Pop While:Goto FineCicloWhile
EndIf
Case "Tempo"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
Tempo.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Tempo=00/00")*8
If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
FineTempo.w=InizioEvento+LunghezzaEvento-1
XPosizioneTempo.w=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
YPosizioneTempo.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneTempo>=InizioEvento Then StessoEvento OR %00001
If XPosizioneTempo<FineTempo Then StessoEvento OR %00010
If YPosizioneTempo=Tempo Then StessoEvento OR %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new tempo|with the current channel?","Yes|No")
If AggiungiEvento=0
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
StessoEvento OR %10000
EndIf
Else
TipoDiEvento$=TipoDiEventoSelezionato$
ImpostaMenuFinestraEditoreSequenza{}
StessoEvento OR %10000
EndIf
If EventoSelezionato=True
MuoviGliEventiSelezionatiConIlTopo{XPosizioneTempo,YPosizioneTempo}
If EventoMusicaleSpostatoConIlTopo=False
EventiSelezionati-1
EventoMusicale()\Selezionato=False
EndIf
Else
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Pop While:Goto FineCicloWhile
EndIf
End Select
Else
If EventoMusicale()\Sequenza=SequenzaSelezionata
If EventoSelezionato=True
Select Modo
Case #CambiaIlCanaleDegliEventiSelezionati
EventoMusicale()\Canale=CanaleSelezionato
Case #AlzaDiUnoGliEventiSelezionati
If EventoMusicale()\Evento<127 Then EventoMusicale()\Evento+1
Case #AbbassaDiUnoGliEventiSelezionati
If EventoMusicale()\Evento>0 Then EventoMusicale()\Evento-1
Case #SpostaAvantiNelTempoGliEventiSelezionati
EventoMusicale()\Inizio+LarghezzaEventoDiBase
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
Case #SpostaIndietroNelTempoGliEventiSelezionati
EventoMusicale()\Inizio-LarghezzaEventoDiBase:If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
Case #EliminaGliEventiSelezionati
If Eventi>0
If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
If InizioEvento+EventoMusicale()\Durata>=DurataSequenza Then DurataSequenza-EventoMusicale()\Durata
XInizioAreaVisibile-EventoMusicale()\Durata
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
KillItem EventoMusicale():Eventi-1
If Eventi=0 Then DurataSequenza=0
EndIf
Case #DeselezionaTuttiGliEventi
EventiSelezionati-1
EventoMusicale()\Selezionato=False
Case #InvertiLaSelezioneDiTuttiGliEventi
EventiSelezionati-1
EventoMusicale()\Selezionato=False
End Select
Select TipoDiEventoSelezionato$
Case "Note"
Select Modo
Case #AllungaLaDurataDelleNoteSelezionate
If EventoMusicale()\Durata=#_MClksPerSP
EventoMusicale()\Durata=LarghezzaEventoDiBase
Else
EventoMusicale()\Durata+LarghezzaEventoDiBase
EndIf
NotaPiuLunga=Max(NotaPiuLunga,EventoMusicale()\Durata)
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
Case #RiduciLaDurataDelleNoteSelezionate
EventoMusicale()\Durata-LarghezzaEventoDiBase
EventoMusicale()\Durata=Max(EventoMusicale()\Durata,#_MClksPerSP)
NotaPiuLunga=Max(EventoMusicale()\Durata,NotaPiuLunga)
Case #AlzaDiUnOttavaLeNoteSelezionate
EventoMusicale()\Evento+12
EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
Case #AbbassaDiUnOttavaLeNoteSelezionate
EventoMusicale()\Evento-12
EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
Case #CambiaIlValoreDegliEventiSelezionati
EventoMusicale()\Valore=ValoreEventoDiBase
End Select
Case "Tempo"
NuoviBattiti.b=EventoMusicale()\Evento MOD 16
NuoveMisure.b=EventoMusicale()\Evento/16
Select Modo
Case #AggiungiUnBattitoAlTempoSelezionato
NuoviBattiti+1
NuoviBattiti=Min(NuoviBattiti,15)
Case #TogliUnBattitoAlTempoSelezionato
NuoviBattiti-1
NuoviBattiti=Max(NuoviBattiti,0)
Case #AggiungiUnaMisuraAlTempoSelezionato
NuoveMisure+1
NuoveMisure=Min(NuoveMisure,7)
Case #TogliUnaMisuraAlTempoSelezionato
NuoveMisure-1
NuoveMisure=Max(NuoveMisure,0)
End Select
EventoMusicale()\Evento=NuoveMisure*16+NuoviBattiti
Default
Select Modo
Case #AggiungiDieciAgliEventiSelezionati
EventoMusicale()\Evento+10
EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
Case #SottraiDieciAgliEventiSelezionati
EventoMusicale()\Evento-10
EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
End Select
End Select
Else
Select Modo
Case #SelezionaTuttiGliEventi
EventiSelezionati+1
EventoMusicale()\Selezionato=True
Case #InvertiLaSelezioneDiTuttiGliEventi
EventiSelezionati+1
EventoMusicale()\Selezionato=True
End Select
EndIf
EndIf
EndIf
Wend
FineCicloWhile
If Modo=#SelezionaUnEvento AND StessoEvento<%11111
If CanaleSelezionato>0
LastItem EventoMusicale()
If AddItem(EventoMusicale())=True
Eventi+1
EventoMusicale()\Inizio=((XInizioAreaVisibile+XTopo-16)*ScalaNote)/LarghezzaEventoDiBase*LarghezzaEventoDiBase
EventoMusicale()\Canale=CanaleSelezionato
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Selezionato=False
EventoMusicale()\Tipo=TipoDiEvento$
Select TipoDiEvento$
Case "Note"
YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
EventoMusicale()\Evento=127-YInizioAreaVisibile-YTopo/8
EventoMusicale()\Durata=LarghezzaEventoDiBase
EventoMusicale()\Valore=ValoreEventoDiBase
If NotaSuonata\Eseguito=True
SmettiDiSuonareLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
EndIf
NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Inizio,EventoMusicale()\Canale,EventoMusicale()\Sequenza
NotaSuonata\Durata=EventoMusicale()\Durata,EventoMusicale()\Valore
SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
NotaSuonata\Eseguito=True
Case "Program"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
Case "Control"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
EventoMusicale()\Valore=ValoreEventoDiBase
Case "Tempo"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
End Select
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
EndIf
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
EndIf
If Modo=#SelezionaGliEventiUguali
ResetList EventoMusicale()
Nota=127-YInizioAreaVisibile-YTopo/8
While NextItem(EventoMusicale())=True
If EventoMusicale()\Canale=CanaleSelezionato AND EventoMusicale()\Sequenza=SequenzaSelezionata
If EventoMusicale()\Selezionato=False
Select TipoDiEvento$
Case "Note"
If EventoMusicale()\Evento=Nota
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Case "Program"
If EventoMusicale()\Evento=Programma
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Case "Control"
If EventoMusicale()\Evento=Controllo
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Case "Tempo"
If EventoMusicale()\Evento=Tempo
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
End Select
EndIf
EndIf
Wend
EndIf
If NotaPiuLunga>0
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
WLocate XMessaggio,YMessaggio
WColour 1,0
Print SPACE$(80-XMessaggio/8)
WLocate XMessaggio,YMessaggio
Print "Len>":ConvertiIlTempoInBattute{NotaPiuLunga,Battiti,Misure,True}
EndIf
End Statement
;-----------------------------------------------
;questa procedura si occupa eseguire gli eventi
;this procedure executes the events
;-----------------------------------
Statement EseguiGliEventi{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED FineMotivo
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TicPerCinquantesimoDiSecondo
ResetTimer
Tempo.l=Timer
If Modo=#EseguiGliEventiDallaFinestraPrincipale Then FineEsecuzione.l=FineMotivo
If Modo=#EseguiGliEventiDallEditoreSequenza Then FineEsecuzione=DurataSequenza
Repeat
Tempo=Timer*TicPerCinquantesimoDiSecondo
EventoFinestraEsecutoreEventiMusicali.l=Event
If EventoFinestraEsecutoreEventiMusicali=#HaiChiusoLaFinestra Then Pop Repeat:Statement Return
ResetList EventoMusicale()
While NextItem(EventoMusicale())
SequenzaEvento.w=EventoMusicale()\Sequenza
If SequenzaEvento=SequenzaSelezionata OR Modo=#EseguiGliEventiDallaFinestraPrincipale
If Modo=#EseguiGliEventiDallaFinestraPrincipale
InizioEvento.l=Sequenza(SequenzaEvento)\Inizio+EventoMusicale()\Inizio
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
InizioEvento.l=EventoMusicale()\Inizio
EndIf
TipoDiEvento$=EventoMusicale()\Tipo
DurataEvento.l=EventoMusicale()\Durata
FineEvento.l=InizioEvento+DurataEvento-1
CanaleEvento.b=EventoMusicale()\Canale
EventoEseguito.b=EventoMusicale()\Eseguito
If EventoEseguito=0 AND Tempo>=InizioEvento
If TipoDiEvento$="Note"
Nota.b=EventoMusicale()\Evento
VelocitaNota.b=EventoMusicale()\Valore
SuonaLaNota{Nota,VelocitaNota,CanaleEvento,Modo}
If Modo=#EseguiGliEventiDallEditoreSequenza
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataEvento,CanaleEvento,#EventoEvidenziato}
EndIf
Else
Select TipoDiEvento$
Case "Program"
Programma.b=EventoMusicale()\Evento
EseguiIlCambioDiProgramma{Programma,CanaleEvento,Modo}
Case "Control"
Controllo.b=EventoMusicale()\Evento:ValoreEvento.b=EventoMusicale()\Valore
EseguiIlCambioDiControllo{Controllo,ValoreEvento,CanaleEvento,Modo}
Case "Tempo"
TempoCambiato.b=EventoMusicale()\Evento
MostraIlTempo{TempoCambiato,Modo}
End Select
EndIf
EventoMusicale()\Eseguito=1
EndIf
If EventoEseguito=1 AND Tempo>=FineEvento
Nota=EventoMusicale()\Evento
VelocitaNota=EventoMusicale()\Valore
EventoSelezionato.b=EventoMusicale()\Selezionato
If TipoDiEvento$="Note"
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEvento,Modo}
If Modo=#EseguiGliEventiDallEditoreSequenza
If EventoSelezionato=True
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataEvento,CanaleEvento,#EventoSelezionato}
Else
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataEvento,CanaleEvento,#EventoNonSelezionato}
EndIf
EndIf
EndIf
EventoMusicale()\Eseguito=2
EndIf
EndIf
Wend
Until Tempo>=FineEsecuzione
ResetList EventoMusicale()
While NextItem(EventoMusicale())
If EventoMusicale()\Tipo="Note" AND EventoMusicale()\Eseguito=1
Nota=EventoMusicale()\Evento
VelocitaNota=EventoMusicale()\Valore
CanaleEvento=EventoMusicale()\Canale
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEvento,0}
EndIf
EventoMusicale()\Eseguito=0
Wend
Quiet %1111
End Statement
Statement AggiungiUnaNotaDallaTastiera{Nota$}
SHARED AreaInvisibileDelleNote
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED Eventi
SHARED EventoMusicale()
SHARED LarghezzaEventoDiBase
SHARED NotaSuonata
SHARED OttavaSelezionata
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED ValoreEventoDiBase
SHARED XInizioAreaVisibile
Select Nota$
Case "C1"
Nota.b=0
Case "C#1"
Nota=1
Case "D1"
Nota=2
Case "D#1"
Nota=3
Case "E1"
Nota=4
Case "F1"
Nota=5
Case "F#1"
Nota=6
Case "G1"
Nota=7
Case "G#1"
Nota=8
Case "A1"
Nota=9
Case "A#1"
Nota=10
Case "B1"
Nota=11
Case "C2"
Nota=12
Case "C#2"
Nota=13
Case "D2"
Nota=14
Case "D#2"
Nota=15
Case "E2"
Nota=16
Case "F2"
Nota=17
Case "F#2"
Nota=18
Case "G2"
Nota=19
Case "G#2"
Nota=20
Case "A2"
Nota=21
Case "A#2"
Nota=22
Case "B2"
Nota=23
End Select
Nota+OttavaSelezionata*12:Nota=Min(Nota,127)
If CanaleSelezionato>0
LastItem EventoMusicale()
If AddItem(EventoMusicale())=True
Eventi+1
EventoMusicale()\Tipo="Note"
EventoMusicale()\Evento=Nota
EventoMusicale()\Inizio=DurataSequenza/LarghezzaEventoDiBase*LarghezzaEventoDiBase
EventoMusicale()\Canale=CanaleSelezionato
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Selezionato=False
EventoMusicale()\Durata=LarghezzaEventoDiBase
EventoMusicale()\Valore=ValoreEventoDiBase
If NotaSuonata\Eseguito=True
Nota.b=NotaSuonata\Evento
VelocitaNota.b=NotaSuonata\Valore
CanaleNota.b=NotaSuonata\Canale
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiDallEditoreSequenza}
EndIf
NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Inizio,EventoMusicale()\Canale,EventoMusicale()\Sequenza
NotaSuonata\Durata=EventoMusicale()\Durata,EventoMusicale()\Valore
SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
NotaSuonata\Eseguito=True
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
EndIf
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
End Statement
;------------------------------------------------
;questa procedura permette di gestire gli eventi
;this procedure permits to manage events
;----------------------------------------
Statement EditoreSequenza{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaSchermo
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED Eventi
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoDiBase
SHARED LarghezzaSchermo
SHARED MIDIAttivato
SHARED Misure
SHARED MostraNuovoValore
SHARED NotaSuonata
SHARED NoteSuonate
SHARED OttavaSelezionata
SHARED PeriFreq()
SHARED PrimaVoltaNellEditoreSequenza
SHARED ScalaNote
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TastoBackspace$
SHARED TastoCursoreDestra$
SHARED TastoCursoreGiu$
SHARED TastoCursoreSinistra$
SHARED TastoCursoreSu$
SHARED TastoEsc$
SHARED TicPerCinquantesimoDiSecondo
SHARED TipoDiEvento$
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED XLunSlider
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YLunSlider
SHARED YTopo
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
Eventi=Sequenza(SequenzaSelezionata-1)\Eventi
EventiSelezionati=Sequenza(SequenzaSelezionata-1)\EventiSelezionati
TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+"-"
If Eventi>0
TitoloFinestra$+Str$(EventiSelezionati)+"selected event"
If EventiSelezionati<>1 Then TitoloFinestra$+"s"
TitoloFinestra$+" of "+Str$(Eventi)+" event"
If Eventi<>1 Then TitoloFinestra$+"s"
Else
TitoloFinestra$+"no events into this sequence"
EndIf
Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
LarghezzaInternaFinestraEditoreSequenza=InnerWidth
AltezzaInternaFinestraEditoreSequenza=InnerHeight
CloseWindow #FinestraEditoreSequenza
AreaInvisibileDelleNote.b=128-(AltezzaInternaFinestraEditoreSequenza-8-8)/8
AreaVisibileDeiValori.w=(128-AreaInvisibileDelleNote)*8-1-7
XLunSlider=16
YLunSlider=AltezzaInternaFinestraEditoreSequenza-8-8
ImpostaSlider{1,0,0,"VERTICAL",0,#ListaGadgetEditoreSequenza}
XLunSlider=LarghezzaInternaFinestraEditoreSequenza-16
YLunSlider=8
ImpostaSlider{2,16,AltezzaInternaFinestraEditoreSequenza-8-8,"HORIZONTAL",0,#ListaGadgetEditoreSequenza}
Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetEditoreSequenza
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #DueColoriConSfondoPieno
SetZone 0,0,0,LarghezzaInternaFinestraEditoreSequenza-1,AltezzaInternaFinestraEditoreSequenza-1-8-8
Format "00"
For Canale.b=1 To 16
X0Canale.w=(Canale-1)*16:Y0Canale.w=AltezzaInternaFinestraEditoreSequenza-8
WLocate X0Canale,Y0Canale
If Canale=CanaleSelezionato
WColour Canale-1,16-Canale
Else
If ColoriOriginali=True
WColour Canale MOD 2+1,Canale MOD 2
Else
WColour 10+(Canale MOD 2)*2,9+(Canale MOD 2)*2
EndIf
EndIf
Print Canale
SetZone Canale,X0Canale,Y0Canale,X0Canale+15,Y0Canale+7
Next Canale
Format ""
WLocate X0Canale+16,Y0Canale
If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
Print "All":SetZone 17,X0Canale+16,Y0Canale,X0Canale+16+23,Y0Canale+7
WLocate X0Canale+16+8*3,Y0Canale
If ColoriOriginali=True Then WColour 1,0 Else WColour 15,14
Print "None":SetZone 18,X0Canale+16+8*3,Y0Canale,X0Canale+16+8*3+8*4-1,Y0Canale+7
WLocate X0Canale+16+8*3+8*4,Y0Canale
If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
Print "Toggle":SetZone 19,X0Canale+16+8*3+8*4,Y0Canale,X0Canale+16+8*3+8*4+8*6-1,Y0Canale+7
MostraLaScalaDelleNote{}
SetZone 20,0,AltezzaInternaFinestraEditoreSequenza-8-8,15,AltezzaInternaFinestraEditoreSequenza-8-8+7
InizioSequenza.l=Sequenza(SequenzaSelezionata-1)\Inizio
Repeat
If SecondoClicDelTopo.b=False
TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+"-"
If Eventi>0
TitoloFinestra$+Str$(EventiSelezionati)+" selected event"
If EventiSelezionati<>1 Then TitoloFinestra$+"s"
TitoloFinestra$+" of "+Str$(Eventi)+" event"
If Eventi<>1 Then TitoloFinestra$+"s"
Else
TitoloFinestra$+"no events into this sequence"
EndIf
WTitle TitoloFinestra$
If PrimaVoltaNellEditoreSequenza=True
;------------------------------------------------------------------
;questa variabile indica l'inizio delle note nell'editore sequenza
;this variable states the note beginning in the sequence editor
;---------------------------------------------------------------
YInizioAreaVisibile=127-(127-AreaInvisibileDelleNote)-#_MiddleC
EndIf
ImpostaMenuFinestraEditoreSequenza{}
MostraLeNoteDiSfondoConILoroNomi{}
MostraLeBattute{}
MostraGliEventiMusicali{}
MostraSliderEditoreSequenza{}
SecondoClicDelTopo=True
EndIf
If NotaSuonata\Eseguito=True
Nota.b=NotaSuonata\Evento:InizioNota.l=NotaSuonata\Inizio
FineNota.l=InizioNota+NotaSuonata\Durata-1
VelocitaNota.b=NotaSuonata\Valore
CanaleNota.b=NotaSuonata\Canale
If Tempo>FineNota
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiDallEditoreSequenza}
NotaSuonata\Eseguito=False
EndIf
Else
ResetTimer
EndIf
If NoteSuonate>0
If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)
Messaggio$+" still playing:|clicking on OK you will stop "
If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
EZRequest "AmySequencer message",Messaggio$,"OK"
InterrompiTutteLeNote{#EseguiGliEventiDallEditoreSequenza}
NoteSuonate=0
EndIf
If PrimaVoltaNellEditoreSequenza=True
MostraITastiDaUsare{}
MostraLaMappaturaDelleNoteSullaTastiera{}
PrimaVoltaNellEditoreSequenza=False
EndIf
EventoFinestraEditoreSequenza.l=Event
TempoTrascorso.l=Timer
Select EventoFinestraEditoreSequenza
Case #HaiPremutoUnTastoDelTopo
TastoCliccatoDelTopo=MButtons:TastoPremutoDelTopo=Joyb(0)
XTopo=WMouseX:YTopo=WMouseY:ZonaTopo.b=Zone(XTopo,YTopo)
Select TastoCliccatoDelTopo
Case 1
Select ZonaTopo
Case 0
Selezione{#SelezionaUnEvento}
Case 1
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=1:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 2
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=2:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 3
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=3:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 4
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=4:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 5
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=5:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSeleZionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 6
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=6:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 7
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=7:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 8
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=8:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 9
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=9:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 10
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=10:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 11
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=11:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 12
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=12:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 13
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=13:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 14
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=14:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 15
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=15:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 16
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=16:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 17
Selezione{#SelezionaTuttiGliEventi}
NoteSelezionate=Note
Case 18
Selezione{#DeselezionaTuttiGliEventi}
NoteSelezionate=0
Case 19
Selezione{#InvertiLaSelezioneDiTuttiGliEventi}
Case 20
ScalaNote+ScalaNote
If ScalaNote=64 Then ScalaNote=1
AreaInvisibileDelTempo=(DurataSequenza-LarghezzaInternaFinestraEditoreSequenza-16)/ScalaNote
MostraLaScalaDelleNote{}
MostraSliderEditoreSequenza{}
End Select
SecondoClicDelTopo=False
Case 5
If TempoTrascorso>49 AND ZonaTopo=0
Selezione{#SelezionaGliEventiUguali}
SecondoClicDelTopo=False
Else
SecondoClicDelTopo=True
EndIf
End Select
; Case #HaiPremutoUnGadget
; Select GadgetHit
; Case 1
; AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
; YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
; Case 2
; LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
; XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
; End Select
Case #HaiRilasciatoUnGadget
Select GadgetHit
Case 1
AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
Case 2
LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
End Select
SecondoClicDelTopo=False
Case #HaiAttivatoIlMenu
If MenuHit=0 AND ItemHit=0 Then EseguiGliEventi{#EseguiGliEventiDallEditoreSequenza}
If MenuHit=1 AND ItemHit=0 Then TipoDiEvento$="Note"
If MenuHit=1 AND ItemHit=1 Then TipoDiEvento$="Program"
If MenuHit=1 AND ItemHit=2 Then TipoDiEvento$="Control"
If MenuHit=1 AND ItemHit=3 Then TipoDiEvento$="Tempo"
If MenuHit=2 AND ItemHit=0 Then CambiaLEventoDiBase{}
If MenuHit=2 AND ItemHit=1 Then MostraNuovoValore=NOT MostraNuovoValore
If MenuHit=3 AND ItemHit=0 Then MostraITastiDaUsare{}
If MenuHit=3 AND ItemHit=1 Then MostraLaMappaturaDelleNoteSullaTastiera{}
SecondoClicDelTopo=False
Case #HaiChiusoLaFinestra
EsciDallEditoreSequenza.b=True
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$):TastoRiga.w=RawKey
If TastoPremuto$=TastoEsc$ Then EsciDallEditoreSequenza=True
Select TastoRiga
Case 2
Nota$="C#2"
Case 3
Nota$="D#2"
Case 5
Nota$="F#2"
Case 6
Nota$="G#2"
Case 7
Nota$="A#2"
Case 16
Nota$="C2"
Case 17
Nota$="D2"
Case 18
Nota$="E2"
Case 19
Nota$="F2"
Case 20
Nota$="G2"
Case 21
Nota$="A2"
Case 22
Nota$="B2"
Case 33
Nota$="C#1"
Case 34
Nota$="D#1"
Case 35
Nota$="F#1"
Case 36
Nota$="G#1"
Case 37
Nota$="A#1"
Case 49
Nota$="C1"
Case 50
Nota$="D1"
Case 51
Nota$="E1"
Case 52
Nota$="F1"
Case 53
Nota$="G1"
Case 54
Nota$="A1"
Case 55
Nota$="B1"
Case 80
OttavaSelezionata=0
Case 81
OttavaSelezionata=1
Case 82
OttavaSelezionata=2
Case 83
OttavaSelezionata=3
Case 84
OttavaSelezionata=4
Case 85
OttavaSelezionata=5
Case 86
OttavaSelezionata=6
Case 87
OttavaSelezionata=7
Case 88
OttavaSelezionata=8
Case 89
OttavaSelezionata=9
Default
TastoRiga=0
End Select
If TastoRiga>0
If TastoRiga<80
AggiungiUnaNotaDallaTastiera{Nota$}
Else
YInizioAreaVisibile=Max(127-(127-AreaInvisibileDelleNote)-OttavaSelezionata*12,0)
EndIf
EndIf
If EventiSelezionati>0
TastiShiftPremuti.b=(Qualifier-$8000) AND %11
If TastiShiftPremuti>0
Select TastoPremuto$
Case TastoBackspace$
Selezione{#EliminaGliEventiSelezionati}
Case TastoCursoreSu$
If TipoDiEvento$="Note" Then Selezione{#AlzaDiUnOttavaLeNoteSelezionate}
If TipoDiEvento$="Program" Then Selezione{#AggiungiDieciAgliEventiSelezionati}
If TipoDiEvento$="Control" Then Selezione{#AggiungiDieciAgliEventiSelezionati}
If TipoDiEvento$="Tempo" Then Selezione{#AggiungiUnaMisuraAlTempoSelezionato}
Case TastoCursoreGiu$
If TipoDiEvento$="Note" Then Selezione{#AbbassaDiUnOttavaLeNoteSelezionate}
If TipoDiEvento$="Program" Then Selezione{#SottraiDieciAgliEventiSelezionati}
If TipoDiEvento$="Control" Then Selezione{#SottraiDieciAgliEventiSelezionati}
If TipoDiEvento$="Tempo" Then Selezione{#TogliUnaMisuraAlTempoSelezionato}
Case TastoCursoreDestra$
If TipoDiEvento$="Note" Then Selezione{#AllungaLaDurataDelleNoteSelezionate}
Case TastoCursoreSinistra$
If TipoDiEvento$="Note" Then Selezione{#RiduciLaDurataDelleNoteSelezionate}
End Select
Else
Select TastoPremuto$
Case TastoBackspace$
If LastItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
DurataSequenza-EventoMusicale()\Durata
XInizioAreaVisibile-EventoMusicale()\Durata
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
KillItem EventoMusicale():Eventi-1
EndIf
Case TastoCursoreSu$
If TipoDiEvento$="Tempo"
Selezione{#AggiungiUnBattitoAlTempoSelezionato}
Else
Selezione{#AlzaDiUnoGliEventiSelezionati}
EndIf
Case TastoCursoreGiu$
If TipoDiEvento$="Tempo"
Selezione{#TogliUnBattitoAlTempoSelezionato}
Else
Selezione{#AbbassaDiUnoGliEventiSelezionati}
EndIf
Case TastoCursoreDestra$
Selezione{#SpostaAvantiNelTempoGliEventiSelezionati}
Case TastoCursoreSinistra$
Selezione{#SpostaIndietroNelTempoGliEventiSelezionati}
End Select
EndIf
Else
Select TastoPremuto$
Case TastoBackspace$
If LastItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
DurataSequenza-EventoMusicale()\Durata
XInizioAreaVisibile-EventoMusicale()\Durata
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
KillItem EventoMusicale():Eventi-1
EndIf
Case TastoCursoreSu$
If YInizioAreaVisibile>0 Then YInizioAreaVisibile-1
Case TastoCursoreGiu$
If YInizioAreaVisibile<AreaInvisibileDelleNote Then YInizioAreaVisibile+1
Case TastoCursoreDestra$
XInizioAreaVisibile+LarghezzaEventoDiBase
XInizioAreaVisibile=Min(XInizioAreaVisibile,AreaInvisibileDelTempo)
Case TastoCursoreSinistra$
XInizioAreaVisibile-LarghezzaEventoDiBase
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
End Select
EndIf
If TastoPremuto$=" " Then DurataSequenza+192*(4.0/Misure)
SecondoClicDelTopo=False
End Select
Tempo=Timer*TicPerCinquantesimoDiSecondo
Until EsciDallEditoreSequenza=True
Sequenza(SequenzaSelezionata-1)\Eventi=Eventi
Sequenza(SequenzaSelezionata-1)\EventiSelezionati=EventiSelezionati
Sequenza(SequenzaSelezionata-1)\Inizio=InizioSequenza
Sequenza(SequenzaSelezionata-1)\Durata=DurataSequenza
CloseWindow #FinestraEditoreSequenza
Use Window #FinestraPrincipale
WJam #UnColoreConSfondoTrasparente
End Statement
;---------------------------------------------
;questa procedura mostra la sequenza indicata
;this procedure shows the stated sequence
;-----------------------------------------
Statement MostraSequenza{NomeSequenza$,InizioSequenza.l,YSequenza.b,DurataSequenza.l,EventiSequenza.l,ModoDisegno.b}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED SequenzeVisibili
SHARED XSequenzeVisibili
SHARED YSequenzeVisibili
Y0.w=8+YSequenza*8:Y1.w=Y0+7
If Y0>=8 AND Y1<8+SequenzeVisibili*8
FineSequenza.l=InizioSequenza+DurataSequenza-1
I.w=16+InizioSequenza-XSequenzeVisibili
F.w=16+FineSequenza-XSequenzeVisibili
If I>=16 AND I<LarghezzaInternaFinestraPrincipale
InizioSequenzaVisibile.b=True
Else
InizioSequenzaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraPrincipale
FineSequenzaVisibile.b=True
Else
FineSequenzaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraPrincipale
SequenzaVisibile.b=True
Else
If InizioSequenzaVisibile=True OR FineSequenzaVisibile=True
SequenzaVisibile=True
Else
SequenzaVisibile=False
EndIf
EndIf
If SequenzaVisibile=True
X0Sequenza.w=Min(Max(I,16),LarghezzaInternaFinestraPrincipale-1)
Y0Sequenza.w=Min(Max(Y0,8),AltezzaInternaFinestraPrincipale-1-8-8-4-7)
X1Sequenza.w=Min(Max(F,16),LarghezzaInternaFinestraPrincipale-1)
Y1Sequenza.w=Min(Max(Y1,8+7),AltezzaInternaFinestraPrincipale-1-8-8-4)
ColoreSequenza.b=(YSequenza+YSequenzeVisibili) MOD 16
WBox X0Sequenza,Y0Sequenza,X1Sequenza,Y1Sequenza,ColoreSequenza
If ModoDisegno=#SequenzaSelezionata
Wline X0Sequenza,Y0,X1Sequenza,Y1,15-ColoreSequenza
Wline X0Sequenza,Y1,X1Sequenza,Y0,15-ColoreSequenza
EndIf
If ModoDisegno=#SequenzaNonSelezionata
Wline X0Sequenza+1,Y0Sequenza+1,X1Sequenza-1,Y0Sequenza+1,15-ColoreSequenza
Wline X0Sequenza+1,Y1Sequenza-1,X1Sequenza-1,Y1Sequenza-1,15-ColoreSequenza
EndIf
If ModoDisegno=#SequenzaNonSelezionata
If InizioSequenzaVisibile=True
Wline I+1,Y0Sequenza+1,I+1,Y1Sequenza-1,15-ColoreSequenza
EndIf
If FineSequenzaVisibile=True
Wline F-1,Y0Sequenza+1,F-1,Y1Sequenza-1,15-ColoreSequenza
EndIf
EndIf
If NomeSequenza$="" Then NomeSequenza$="Sequence "+Str$(YSequenza+YSequenzeVisibili+1)
If I>=16 OR I<LarghezzaInternaFinestraPrincipale OR F>=16 OR F<LarghezzaInternaFinestraPrincipale
WColour 15-ColoreSequenza,ColoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraPrincipale-1)
WLocate I,Y0Sequenza:Print Left$(Right$(NomeSequenza$,(F-16+1)/8),(F-I+1)/8)
EndIf
EndIf
EndIf
End Statement
;--------------------------------------------------------------
;questa procedura mostra le sequenze nella finestra principale
;this procedure show the sequences in the main window
;-----------------------------------------------------
Statement MostraLeSequenze{}
SHARED AreaInvisibileDelMotivo
SHARED ColoriOriginali
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED Sequenze
SHARED SequenzeVisibili
SHARED XSequenzeVisibili
SHARED YSequenzeVisibili
While Sequenze>0 AND YSequenza<SequenzeVisibili
NomeSequenza$=Sequenza(YSequenza+YSequenzeVisibili)\Nome
InizioSequenza.l=Sequenza(YSequenza+YSequenzeVisibili)\Inizio
DurataSequenza.l=Sequenza(YSequenza+YSequenzeVisibili)\Durata
If DurataSequenza>0
EventiSequenza.l=Sequenza(YSequenza+YSequenzeVisibili)\Eventi
If YSequenza+YSequenzeVisibili+1=SequenzaSelezionata Then Modo.b=#SequenzaSelezionata Else Modo=#SequenzaNonSelezionata
MostraSequenza{NomeSequenza$,InizioSequenza,YSequenza,DurataSequenza,EventiSequenza,Modo}
EndIf
YSequenza+1
Wend
FineMotivo=0
For TutteLeSequenze.w=0 To #MassimoSequenze-1
DurataSequenza.l=Sequenza(TutteLeSequenze)\Durata
If DurataSequenza>0
FineSequenza.l=Sequenza(TutteLeSequenze)\Inizio+DurataSequenza-1
FineMotivo=Max(FineMotivo,FineSequenza+1)
EndIf
Next TutteLeSequenze
AreaInvisibileDelMotivo=Max(FineMotivo-(LarghezzaInternaFinestraPrincipale-16),0)
MostraSlider{3,XSequenzeVisibili,AreaInvisibileDelMotivo,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}
End Statement
Statement MostraIBattitiPerMinuto{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED BattuteAlMinuto
SHARED TicPerCinquantesimoDiSecondo
WLocate 0,AltezzaSchermo-(AltezzaFonte+3)-8-8
WColour 3:Print "BPM>",BattuteAlMinuto," Ticks/50th>",TicPerCinquantesimoDiSecondo
End Statement
;-----------------------------------------------------------
;questa pprocedura elimina tutti gli eventi du una sequenza
;this procedure deletes all the events of a sequence
;----------------------------------------------------
Statement EliminaTuttiGliEventiDellaSequenza{Sequenza.w}
SHARED EventoMusicale()
SHARED Sequenza()
If Sequenza(Sequenza)\Eventi>0
While NextItem(EventoMusicale())=True
If EventoMusicale()\Sequenza=Sequenza Then KillItem EventoMusicale()
Wend
EndIf
End Statement
;*********************************************
;Fine delle procedure ed inizio del programma
;procedures end and program start
;*********************************
;----------------------------------------------------
;questo programma puo' essere lanciato dal Workbench
;this program can be launched from Workbench
;_-------------------------------------------
WBStartup
BlitMode CookieMode
CaricaLaFonteDiCaratteriTopaz8{}
ImpostaIlParlatoDellAmiga{}
CaricaLeImmaginiDelleNote{}
CreaLaBitmapPerLImmagineDiSfondo{}
ImpostaLoSchermo{}
CaricaLImmagineDiSfondoNellaBitmap{}
CaricaLaStoriaDeiProgettiAperti{}
ImpostaLaFinestraPrincipale{}
CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}
AttivaMIDI{}
Sequenze.w=0
SequenzaSelezionata.w=0
VoceSpenta=%1111
;-----------------
;clclo principale
;main loop
;----------
Repeat
If SecondoClicDelTopo.b=False
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
MostraGliEventiMusicaliDisponibili{}
MostraLeSequenze{}
MostraIBattitiPerMinuto{}
MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}
Redraw #FinestraPrincipale
SecondoClicDelTopo=True
EndIf
If NoteSuonate>0
If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)
Messaggio$+"still playing:|clicking on OK you will stop "
If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
EZRequest "AmySequencer message",Messaggio$,"OK"
InterrompiTutteLeNote{#EseguiGliEventiDallaFinestraPrincipale}
NoteSuonate=0
EndIf
;--------------------------------------------------------------
;questa variabile cattura gli eventi della finestra principale
;this variable catch main window events
;---------------------------------------
EventoFinestraPrincipale.l=WaitEvent
Select EventoFinestraPrincipale
;------------------------------------
;se avete premuto un tasto del mouse
;if you have prssed a mouse button
;----------------------------------
Case #HaiPremutoUnTastoDelTopo
XTopo=WMouseX:YTopo=WMouseY:TastoCliccatoDelTopo.b=MButtons
Select TastoCliccatoDelTopo
Case #TastoSinistroDelTopoPremuto
If YTopo>=8 AND YTopo<8+SequenzeVisibili*8
SequenzaSelezionata=YSequenzeVisibili+(YTopo-8)/8+1
If Sequenza(SequenzaSelezionata-1)\Durata=0 Then Sequenze+1
Sequenza(SequenzaSelezionata-1)\Inizio=XSequenzeVisibili+XTopo-16
Sequenza(SequenzaSelezionata-1)\Durata=Max(Sequenza(SequenzaSelezionata-1)\Durata,192*4.0*Battiti/Misure)
EndIf
If YTopo>AltezzaInternaFinestraPrincipale-1-8-8 AND YTopo<AltezzaInternaFinestraPrincipale-8
If XTopo>LarghezzaInternaFinestraPrincipale-Len("Tempo=00/00")*8
CambiaLaMisuraDelTempo{}
MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}
EndIf
EndIf
SecondoClicDelTopo=False
Case #TastoSinistroDelTopoRilasciato
SecondoClicDelTopo=True
End Select
;---------------------------
;se avete premuto un gadget
;if you have pressed a gadget
;-----------------------------
; Case #HaiPremutoUnGadget
; Select GadgetHit
; Case 1
; LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
; BattuteAlMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
; TicPerCinquantesimoDiSecondo=BattuteAlMinuto*192*4/3000
; Case 2
; AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
; YSequenzeVisibili=ValoreSlider{2,#MassimoSequenze-SequenzeVisibili,LunghezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
; Case 3
; LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
; XSequenzeVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
; End Select
; SecondoClicDelTopo=False
;------------------------------
;se avete rilasciato un gadget
;if you have released a gadget
;------------------------------
Case #HaiRilasciatoUnGadget
Select GadgetHit
Case 1
LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
BattuteAlMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
TicPerCinquantesimoDiSecondo=BattuteAlMinuto*192*4/3000
Case 2
AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
YSequenzeVisibili=ValoreSlider{2,#MassimoSequenze-SequenzeVisibili,AltezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
Case 3
LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
XSequenzeVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
End Select
SecondoClicDelTopo=False
;--------------------------------------
;se avete attivato il menu' principale
;if you have activated main menu
;--------------------------------
Case #HaiAttivatoIlMenu
Select MenuHit
Case 0
If ItemHit=1
CaricaUnProgetto{}
ImpostaLaFinestraPrincipale{}
EndIf
Case 1
If ItemHit=0
EseguiGliEventi{#EseguiGliEventiDallaFinestraPrincipale}
MostraIlTempo{(Misure-1)*16+Battiti-1,#EseguiGliEventiDallaFinestraPrincipale}
EndIf
Case 2
Select ItemHit
Case 0
EditoreSuoni{}
Case 1
If SequenzaSelezionata>0
EditoreSequenza{}
Else
EZRequest "AmySequencer message","You must select a sequence first","OK"
EndIf
End Select
Case 3
Select ItemHit
Case 0
AttivaMIDI{}
Case 1
ColoriOriginali=NOT ColoriOriginali
CaricaLImmagineDiSfondoNellaBitmap{}
CopiaLoSfondoSottoAlTempo{}
Case 2
If Exists("ProjectsHistory")
CancellaLaStoriaDeiProgettiAperti{}
ImpostaLaFinestraPrincipale{}
EndIf
End Select
End Select
;-------------------------------------------------------------------
;se avete scelto la voce Quit dal menu' Project attiva la variabile
; EsciDalProgramma
;if you have selected voice Quit from Project menu activates EsciDalProgramma
; flag
;------
If MenuHit=0 AND ItemHit=VoceMenuEsci Then EsciDalProgramma=True
SecondoClicDelTopo=False
;--------------------------
;se avete premuto un tasto
;if you have pressed a key
;--------------------------
Case #HaiPremutoUnTasto
;--------------------------------------------
;questa variabile memorizza il tasto premuto
;this variable store key pressed
;--------------------------------
TastoPremuto$=Inkey$
;-------------------------------------------------------------------
;se avete premuto il tasto Esc attiva la variabile EsciDalProgramma
;if you have typed Esc key activates EsciDalProgramma flag
;----------------------------------------------------------
If TastoPremuto$=TastoEsc$ Then EsciDalProgramma=True
Select TastoPremuto$
Case TastoBackspace$
If SequenzaSelezionata>0
EliminaTuttiGliEventiDellaSequenza{SequenzaSelezionata}
Sequenza(SequenzaSelezionata-1)\Nome=""
Sequenza(SequenzaSelezionata-1)\Inizio=0
Sequenza(SequenzaSelezionata-1)\Durata=0
Sequenza(SequenzaSelezionata-1)\Eventi=0
Sequenza(SequenzaSelezionata-1)\EventiSelezionati=0
Sequenze-1:SequenzaSelezionata=0
EndIf
Case TastoCursoreSu$
If YSequenzeVisibili>0 Then YSequenzeVisibili-1
Case TastoCursoreGiu$
If YSequenzeVisibili<#MassimoSequenze-SequenzeVisibili Then YSequenzeVisibili+1
Case TastoCursoreDestra$
If XSequenzeVisibili<AreaInvisibileDelMotivo
XSequenzeVisibili+LarghezzaEventoDiBase
XSequenzeVisibili=Min(XSequenzeVisibili,AreaInvisibileDelMotivo)
EndIf
Case TastoCursoreSinistra$
If XSequenzeVisibili>0
XSequenzeVisibili-LarghezzaEventoDiBase
XSequenzeVisibili=Max(XSequenzeVisibili,0)
EndIf
End Select
SecondoClicDelTopo=False
End Select
;----------------------------------------------------------------
;ripete il ciclo se la variabile EsciDalProgramma e' disattivata
;repeats loop if EsciDalProgramma flag is deactivated
;-----------------------------------------------------
Until EsciDalProgramma=True
;----------------------
;fine del programma
;program end
;------------
End